尝试在C中生成动态分配的字符串数组时出现分段错误

时间:2014-06-06 18:42:02

标签: c

我正在尝试创建一个将字符串和整数写入文件的函数。我的方法的一部分涉及创建一个二维动态数组来保存一系列字符串。没有编译时错误。但是,当我尝试运行程序时(该函数加上一个main来测试它)我不断收到分段错误错误。到目前为止,我已将其跟踪到下面突出显示的特定代码部分。据我所知,似乎我尝试打开数组是造成seg错误的原因(我使用了一个带有%p字符的调试字符串来确保数组实际上在内存中)。我不能为我的生活说明原因。为方便起见,我只包含了与seg错误以及声明/初始化相关的代码。如果您希望我提供整个主要,请告诉我。为了清楚起见,我已经尝试过谷歌的解决方案,但到目前为止我发现的所有内容要么我不理解,要么与我的情况无关。

int data_cat_num=0,current_cat=0,col_index=0;
char **cat_names;

printf("How many data categories will there be?:");
scanf("%d",&data_cat_num);

cat_names=malloc(data_cat_num*50);/*Currently defaulting to 50 bytes per name*/

while(current_cat<data_cat_num){
    col_index=0;
    printf("What is the name of category %d?",current_cat+1);
    while(cat_names[current_cat][col_index]!='\n'){/*SEG FAULT TRACED TO THIS*/
    cat_names[current_cat][col_index++]=getchar();/*LOOP!!!!!*/
   }
cat_names[current_cat][col_index]='\n';
current_cat++;
}

3 个答案:

答案 0 :(得分:3)

这一行:

cat_names=malloc(data_cat_num*50);

每个名称不分配50个字节;它分配data_cat_num*50个名字。你需要这样做:

cat_names = malloc(data_cat_num * sizeof(char *));
int i;
for(i = 0; i < data_cat_num; i++)
    cat_names[i] = malloc(50);

第一行分配data_cat_num名称(即char *个变量),后来(在for循环中)为每个名称分配50个字节。

编辑此外,当您释放此内存时,您需要这样做:

for(i = 0; i < data_cat_num; i++)
    free(cat_names[i]);
free(cat_names);

答案 1 :(得分:0)

这条线没有你想的那样:

cat_names=malloc(data_cat_num*50);/*Currently defaulting to 50 bytes per name*/

cat_names包含指向字符串的指针,而不是字符串本身。所以,在这里你要分配足够的空间来存储指向50个cat名称的指针,而不是名称本身。

每次添加名称时,您需要做的就是malloc。所以......

cat_names[current_cat] = malloc(maxNameLength*sizeof(char));

答案 2 :(得分:-1)

char **cat_names;

这表示cat_names将是指向指针的指针。

cat_names=malloc(data_cat_num*50);/*Currently defaulting to 50 bytes per name*/

这会使cat_names成为指针,但是指向垃圾的指针,因为malloc返回的内存未初始化。

cat_names[current_cat][col_index]='\n';

糟糕,您使用cat_names内容作为指针,但它指向垃圾。