【发布时间】:2014-05-12 18:01:44
【问题描述】:
我一直在主函数中遇到段错误。我创建了一个指向我创建的结构的指针,并将它的引用传递给另一个分配和重新分配内存的函数。然后在主函数(最初定义的地方)中访问它会导致段错误。
这是我的测试代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct {
char desc[20];
int nr;
} Kap;
void read(Kap *k);
int main(void) {
Kap *k = NULL;
read(k);
printf("__%s %d\n", k[4].desc, k[4].nr);
return 0;
}
void read(Kap *k) {
int size = 3;
k = (Kap*) calloc(size, sizeof(Kap));
k[0].nr = 1;
k[1].nr = 2;
k[2].nr = 3;
strcpy(k[0].desc, "hello0");
strcpy(k[1].desc, "hello1");
strcpy(k[2].desc, "hello2");
size *= 2;
k = (Kap*) realloc(k, sizeof(Kap)*size);
if(k == NULL) {
printf("ERROR\n");
exit(EXIT_FAILURE);
}
k[3].nr = 4;
k[4].nr = 5;
k[5].nr = 6;
strcpy(k[3].desc, "hello3");
strcpy(k[4].desc, "hello4");
strcpy(k[5].desc, "hello5");
}
我做错了什么?
【问题讨论】:
-
提示:尝试在 read() 之前和之后打印 main() 中 k 的值。价值观应该改变吧?但他们没有。
-
使用格式
"%p"打印指针。不要忘记转换为 void* 或 char* 之前。 -
请记住,C 中的每个函数都是按值传递的。这意味着,如果您将指针传递给它,该函数实际上会收到该指针的副本。在许多情况下,这是可以的,因为指针及其副本将指向同一个空间。在这种情况下,它不行,因为您希望 main 中的指针
k在调用read后指向其他地方。但是read只能对k的副本进行操作。
标签: c segmentation-fault realloc pass-by-reference