在下面的代码中,我要求用户给我一些字符串。我创建了一个2-D指针char数组,所以我用指针字符串读取输入,该字符串指向长度为50的字符串的开头。我的问题是在输入第一个字符串后我一直崩溃..我假设我的问题与realloc有关。我不习惯..你能帮忙弄清楚发生了什么吗?我尝试使用netbeans进行调试,但没有设法看到任何有趣的内容,因为它没有为realloc提供的新地址提供反馈!!
以下是代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char *str,**string,buffer[50],temp[2];
int i,j,q,size,counter;
size=10;
string=(char**) calloc(size,sizeof(char*));
for (i=0; i<size; i++) string[i]=(char*) malloc(50*sizeof(char));
printf("\nGimme strings, terminate input with x");
i=0;
gets(string[i]);
temp[0]=120;//x
temp[1]='\0';
size=0;
while(strcmp(string[i],temp)!=0)
{
string=realloc(string,size*sizeof(char**));
i++;
gets(string[i]);
size++;
counter++;
}
return 0;
}
我想用这个realloc使指针表更大。
答案 0 :(得分:4)
string=realloc(string,size*sizeof(char**));
i++;
gets(string[i]);
size++;
将realloc
调用为string
后,新部分不包含任何有效指针。因此,当您调用gets
时,您将向它传递一个未能初始化的指针。
此外,size=0;
完全被打破了。
答案 1 :(得分:2)
realloc没有用零初始化分配的内存,此外你忘了初始化新分配的字符串指针。
考虑在while循环中向上移动i++
和size++
。
答案 2 :(得分:0)
初始化所有变量
char *str = NULL,**string = NULL,buffer[50] = {0},temp[2] = {0};
int i = 0,j = 0,q = 0,size = 10,counter = 0;
不要强制转换malloc/calloc
返回的内容,并尽可能使用{}
string=calloc(size,sizeof(char*));
for (i=0; i<size; i++)
{
string[i]=malloc(50*sizeof(char));
}
从键盘阅读时请勿使用gets
,请使用fgets()
,因为您可以指定要阅读的最大尺寸。
printf("\nGimme strings, terminate input with x");
char input[256];
fgets(input,sizeof(input),stdin); // another varname, will explain below
使用较新的编译器,您可以在需要它们的地方声明变量,而不是在函数顶部声明变量。
char temp={'x','\0'}; // 120;//x
设置size = 0这里似乎有点奇怪
size=0;
最好将用户输入的内容保存在单独的缓冲区(输入)中 然后,如果它不是“x”,则将其复制到您的字符串数组中,而不是
while(strcmp(string[i],temp)!=0)
{
string=realloc(string,size*sizeof(char**));
i++;
gets(string[i]);
size++;
counter++;
}
e.g。
while (fgets(input,sizeof(input),stdin) != NULL && input[0] != 'x')
{
string[i] = calloc(1,strlen(input)+1); // add a byte for \0
strncpy(string[i],input,strlen(input)-1); // not copying ending \n
if ( ++i == size ) // a new chunk needed
{
char *newstring = realloc((size + 10)*sizeof(char*), string );
if ( newstring != NULL )
{
string = newstring;
size += 10;
}
}
}