我有要填充的2D数组,然后与文字进行比较
下面是比较代码,我尝试不同的方法都没有成功
char** list;
load(list);
if(strcmp(list[0], "aasdf"))
{
printf("win\n");
}
以上关于strcmp的段错误
加载功能
void load(char **list)
{
int MAX_NUM_LINES = 1000;
FILE *fp;
list = malloc(MAX_NUM_LINES*sizeof(char*));
fp = fopen("list", "r");
line_ct = 0;
char line[256];
while ( fgets(line, 256, fp) != NULL )
{
int len = strlen(line);
list[line_ct] = malloc(len * sizeof(char));
strcpy(list[line_ct], line);
line_ct++;
if(line_ct == MAX_NUM_LINES)
{
break;
}
}
fclose(fp);
}
关于段错误的任何想法?
我也在strcmp之前尝试过
printf("Line: %s\n", *list[0]);
发生段错误
答案 0 :(得分:1)
当您从 load 返回时,未设置var list ,因此当您这样做时
if(strcmp(list[0], "aasdf"))
您使用 list 具有不确定的行为(通常是崩溃)
第一个解决方案是使用输出var
您需要更改
load(list);
作者
load(&list);
,您需要更改 list 的类型,并在 load 中取消引用,因此:
void load(char ***list)
{
*list = malloc(MAX_NUM_LINES*sizeof(char*));
...
(*list)[line_ct] = malloc((len + 1) * sizeof(char));
strcpy((*list)[line_ct], line);
我还为 len 加了1,以放置结尾的空字符。
(编辑)使用***的情况不是很常见,正如@ user3629249在评论中所建议的那样,您可以看看Triple pointers in C: is it a matter of style?仔细阅读答案。
第二种解决方案是返回分配的数组:
char** list = load();
使用
char ** load()
{
char **list;
...
return list;
在分配每行时还将 len 加1
此外,如果您读取多于MAX_NUM_LINES
行,则会以未定义的行为再次从数组中写出,并且 load 的调用者不知道读取了多少行。
为避免这种情况,您可以先使用malloc(0)
初始化 list ,然后每次使用 realloc 来增加 list 的大小。读取一行,可以分配正确的大小。为了向调用者指示大小,您可以使用附加的输出var或分配一个以上的条目以在最后一个条目中放置NULL(这取决于您在调用 load 的代码中使用read数组的方式)