【发布时间】:2017-06-18 20:05:36
【问题描述】:
我编写了代码来模拟选举,这可以按预期工作,但是当我将 BALLOT_SIZE 修改为 7,并在 New_Random_Ballot() 中更改 int v[BALLOT_SIZE] = {0,1,2,3,4,5,6} 的定义时,语句 struct Ballot * New_Ballot = calloc(1, sizeof(struct Ballot *)); 给了我一个分段过错。需要注意的是,将 BALLOT_SIZE 设置为 6 并修改 int v[BALLOT_SIZE] = {0,1,2,3,4,5} 的定义以及这些变量的所有较小设置(例如长度 4、3 或 2)都可以正确执行。为了清楚起见,我删除了对数组进行洗牌的代码。
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#define BALLOT_SIZE 5
#define NUM_VOTERS 50
struct Ballot {
int votes[BALLOT_SIZE];
};
struct Ballot * New_Random_Ballot() {
int v[BALLOT_SIZE] = {0,1,2,3,4};
struct Ballot * New_Ballot = calloc(1, sizeof(struct Ballot *));
for (int j = 0; j < BALLOT_SIZE; j++) {
New_Ballot->votes[j] = v[j];
}
return New_Ballot;
}
void Hold_Election(struct Ballot * Election[NUM_VOTERS]) {
for (int i=0; i < NUM_VOTERS; i++) {
Election[i] = New_Random_Ballot();
}
}
int main() {
struct Ballot * Election[NUM_VOTERS];
Hold_Election(Election);
//free memory
for (int i=0; i < NUM_VOTERS; i++) {
free(Election[i]);
}
return 0;
}
我已经尝试捕获 calloc 调用的返回值并对照 NULL 检查它,但在它能够检查返回值之前,它出错了(在本例中,BALLOT_SIZE 为 7):
struct Ballot * New_Random_Ballot() {
int v[BALLOT_SIZE] = {0,1,2,3,4,5,6};
struct Ballot * New_Ballot = calloc(1, sizeof(struct Ballot *));
if (New_Ballot == NULL) {
perror("could not allocate ballot\n");
}
for (int j = 0; j < BALLOT_SIZE; j++) {
New_Ballot->votes[j] = v[j];
}
return New_Ballot;
}
【问题讨论】:
-
calloc(1, sizeof(struct Ballot *))-->calloc(1, sizeof(struct Ballot))因为sizeof(struct Ballot *)是指针大小。不是对象大小。 -
sizeof(struct Ballot *)指针不是它指向的对象! -
sizeof(struct Ballot) == BALLOT_SIZE * sizeof(int),而 sizeof(struct Ballot*) == sizeof(void*) == 4(或 8 对于 64 位应用程序)。 * 有很大的不同。
标签: c