0

在下面的代码中,我要求用户给我一些字符串。我制作了一个二维指针 char 数组,以便使用指针字符串读取输入,该指针字符串指向长度为 50 的字符串的开头。我的问题是我在输入第一个字符串后一直崩溃.. 我假设我的问题与重新分配有关。我不习惯它..你能帮忙弄清楚发生了什么吗?我尝试使用 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 使指针表更大。

4

3 回答 3

4
    string=realloc(string,size*sizeof(char**));
    i++;
    gets(string[i]);
    size++;

调用realloc放大后string,新部分不包含有效指针。因此,当您调用 时gets,您将向它传递一个您未能初始化的指针。

而且,这size=0;完全被打破了。

于 2013-01-09T13:52:31.077 回答
2

realloc 不会用零初始化分配的内存,此外您忘记初始化新分配的字符串指针。

考虑在 while 循环内向i++上移动。size++

于 2013-01-09T13:50:20.743 回答
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++;
}

例如

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;
     }
   }
}
于 2013-01-09T14:27:19.477 回答