[英]Don't understand why C program crashes, pointer array of strings
我在使用此for循环时遇到了麻烦,但我不明白为什么它会崩溃。 我正在尝试读取“姓氏姓氏”格式的20个名字的输入列表,并将它们作为字符串存储在“姓氏名”中。 重复项不应存储在数组指针中。
当我注释掉malloc和compare循环时,显然地址保持不变存在一些问题,因此* ary返回的值与* walker相同。 filePtr正常工作,并且strcpy和strcat函数没有问题。 同样,删除第一个printf也会导致程序崩溃,即使删除它似乎除了输出外没有任何实际效果。
FILE *filePtr = fopen ("input.txt","r");
int size = 20;
char **ary;
char **walker;
char **end;
int strsize = 0;
char firstname[30] = {0};
char lastname[30] = {0};
char *fullname;
ary = calloc (size, sizeof(char *));
printf("%d\n",sizeof(pAry));
for ( walker = ary ; *walker < (*end = *ary + size) ; walker++)
{
fscanf(filePtr," %s",firstname);
fscanf(filePtr," %[^\n]",lastname);
strsize = strlen(firstname) + strlen(lastname) + 3;
fullname = malloc (strsize * sizeof(char));
strcpy(fullname,lastname);
strcat(fullname,", ");
strcat(fullname,firstname);
for ( compare = 0 ; compare < walker ; compare++)
{
if(strcmp(fullname,*(ary + compare)) != 0)
{
diff = 0;
}
}
if (diff)
{
strncpy(*walker,fullname,strsize);
printf("%s\n",*walker);
}
free(fullname);
}
外循环将遍历ary
所有条目,因此结束条件应测试walker
是否在end
。
这里不需要取消引用:
for (walker = ary; walker < (end = ary + size); walker++)
复制品的测试循环会再次比较绝对指针值,将compares初始化为0
表示相对compare
,因此该行
compare < walker;
应该
compare < (walker - ary);
减去两个指针将返回一个整数,其大小取决于指针的大小,该大小取决于编译器和/或系统。 为了避免这种不确定性,引入了整数类型ptrdiff_t
来保证保留任何指针差。
因此,必须声明compare
:
ptrdiff_t compare;
如果要比较的字符串相等, strcmp()
将返回0
,因此在不等式上将diff
设置为0
是错误的。
您可能想使用以下语句来设置diff
:
diff = strcmp(fullname,*(ary + compare));
如果两个字符串相等(不* diff * erent),则将diff
设置为0
(假)。
在发现欺诈之后,比较也应停止。
if (!diff)
{
break;
}
最后,需要为每个迭代初始化(重新) diff
。
代替
strncpy(*walker, fullname, strsize);
做
*walker = fullname;
作为fullname
引用新分配的内存,需要存储,如在下一次迭代中覆盖。
fullname
free()
行
free(fullname);
然后需要将其删除。
将所有这些放在一起,您将获得:
...
for (walker = ary; walker < (end = ary + size); walker++)
{
...
{
int diff = 1;
for (ptrdiff_t compare = 0; compare < (walker - ary); compare++)
{
diff = strcmp(fullname, *(ary + compare));
if (!diff)
{
break;
}
}
if (diff)
{
*walker = fullname;
printf("%s\n", *walker);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.