在下面的程序中,我期望 for 循环在 3 个元素后停止。
但它会无限期地继续下去,并在稍后因核心转储而失败。
- is
malloc() needed for
char*[]`
- would
strcmp
如果我 memset 为 0 会失败吗?
.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char* str[10]; memset(str,0,10);
str[0]=malloc(sizeof(char)*(strlen("Sample")+1));
str[1]=malloc(sizeof(char)*(strlen("Sample")+1));
str[2]=malloc(sizeof(char)*(strlen("Sample")+1));
strcpy(str[0],"Sample");
strcpy(str[1],"Sample");
strcpy(str[2],"Sample");
int i=0;
for(i=0;strcmp("",str[i])!=0;i++)
{
printf("%d\n",i);;
}
return 0;
}
Edit:即使char* str[10]; memset(str,0,10*sizeof(char*));
代码仍然给出核心转储
总结评论和其他答案中所述的所有内容,这里至少存在三个(或者,如果你想迂腐的话,四个)问题:
- 你需要
memset(str, 0, 10*sizeof(char *)
(但请参见下面的#4)。
- 调用前需要检查是否有空指针
strcmp
,使用类似的条件str[i] != NULL && strcmp("",str[i])!=0
在你的for
loop.
- 如果您在数组中存储了 10 个非空字符串,则循环将一直结束,永远不会找到空字符串。
- (迂腐的)
memset
不是初始化空指针数组的好方法。 (严格来说,它根本不能保证工作。)正如 @user3121023 在评论中建议的,更好的方法是char *str[10] = { NULL }
.
您可以考虑在单独的变量中保留显式计数,而不是使用空字符串(或空指针)作为字符串数组末尾的标记。这可能是更常见的方法。
附录。您问的是是否需要分配字符串。确实需要为字符串分配内存,但不一定需要通过调用来动态分配内存malloc
。至少有三种方法可以实现必要的分配,其中两种方法是编译器为您完成的。这是所有三个的示例:
char sample1[] = "Sample 1";
char *sample2 = malloc(strlen("Sample 2") + 1);
strcpy(sample2, "Sample 2");
str[0] = "Sample 0";
str[1] = sample1;
str[2] = sample2;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)