【发布时间】:2019-06-28 16:20:29
【问题描述】:
在下面的程序中,我希望 for 循环在 3 个元素后停止。 但它会无限期地继续运行,后来由于核心转储而失败。
- 是
malloc() needed forchar*[]` - 如果我将 mem 设置为 0,
strcmp会失败吗?
.
#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;
}
编辑:
即使使用char* str[10]; memset(str,0,10*sizeof(char*));,代码仍然会提供核心转储
【问题讨论】:
-
1.是的。 2.不。一些废话让我发表这个简短的评论。
-
您只需将 10 个字节的数组归零,即 10 个指针。将 10 更改为
10 * sizeof(char *)。您不需要 malloc 中的sizeof (char),因为根据定义,它是 1。是的,如果你想让strcmp()工作,你需要 malloc 全部 10 个。""和空指针是完全不同的东西。 -
在做
strcmp之前应该检查str[i]是否不是NULL -
即使您成功地将
str[]中未使用的条目清零,当您尝试在(可能)NULL 指针上调用strcmp时仍然会遇到麻烦。所以,是的,你想要for(i=0; str[i] != NULL && strcmp("",str[i])!=0; i++)(或者可能是缩写的str[i] && strcmp("",str[i])!=0)。 -
这是对您的问题“
char*[]需要malloc()”的回答。不,这个程序不需要malloc。你不需要它来分配你当前正在分配的三个“Sample”字符串,你也不需要它来分配str。