C动态字符数组

时间:2014-10-01 11:14:26

标签: c

用户在函数dynamic_array中输入字符串后动态扩展数组我的问题似乎是当我尝试在i dynamic_array返回true之后在main中使用扩展数组agian时。

在函数调用后,我尝试使用input打印printf("main string: %s\n", input),程序将崩溃。似乎*input中的main永远不会延长。

int dynamic_array(char *input, int *string_current_len){
  int string_len = 0;
  char temp_c;

  input = (char *) malloc(sizeof(char));

  if(input == NULL) {
    printf("Could not allocate memory!");
    exit(1);
  }  

  printf("File to search in: ");

  while((temp_c = getchar()) != '\n') {
    realloc(input, (sizeof(char)));
    input[string_len++] = temp_c;
  }

  input[string_len] = '\0';

  printf("\nYou entered the string: %s\n", input);
  printf("length of string is %d.\n", string_len);


  *string_current_len = string_len;
  return 1;
}


int main(void) {
  int string_len = 0;
  char *input;

  printf("enter #q as filename or word to quit.\n");
      if(!dynamic_array(input, &string_len)){
       return 0;
      }

   printf("main string: %s\n", input);
   return 0;
}

5 个答案:

答案 0 :(得分:6)

此:

realloc(input, (sizeof(char)));

错了。 realloc()函数不会修改给定的指针(它不能!),它返回新指针。它也可能失败,并返回NULL

此外,第二个参数根本没有任何意义,它应该是先前分配的缓冲区的新的所需总大小,但是你总是通过(非常模糊)1它不是“按这个数量增长”,而是更低级别的“尝试将其增长到这个新大小,并返回增长缓冲区的新位置”。

请仔细阅读the documentation

答案 1 :(得分:0)

if(!dynamic_array(input, &string_len)){
return 0;
}

"输入"使用变量而不进行初始化。

realloc(input,(sizeof(char)));

以上" realloc"正在返回坏指针。它可能完全是假的,或者它可能是从另一个堆分配的。指针必须来自本地'堆。

答案 2 :(得分:0)

realloc(input, (sizeof(char)));

您正在分配相同的大小(即1个字节)。它应该是:

while((temp_c = getchar()) != '\n') {
    realloc(input, (string_len + 1) * (sizeof(char)));
    input[string_len++] = temp_c;

答案 3 :(得分:0)

C具有call-by-value语义。因此,对input内的正式dynamic_array的任何更改都不会传播给调用方(例如您的main)。

您的main未初始化input。如果编译时包含所有警告和调试信息(如您所愿),例如使用gcc -Wall -g,您会收到警告。

我实际上建议初始化每个局部变量。这使得调试更容易(因为运行更具可再现性)。优化程序将删除无用的初始化。

您可以使用

初始化input内的main
  char* input = NULL;

您应该重新设计自己的计划,可能需要grow_array功能(而不是dynamic_array),您可以在main中调用

 grow_array (&input, &string_len);

我请您正确宣布并实施grow_array。我做你的功课太蹩脚了。

grow_array内,您要致电malloc并对其进行测试:

*pptr = malloc(newsize);
if (!*pptr) { perror ("malloc"); exit (EXIT_FAILURE); };

不要忘记使用调试器(gdb)逐步运行程序

我不建议使用realloc,因为错误处理可能很棘手。我建议使用mallocfree以及巧妙地使用mempcy复制数据。

阅读您正在使用的每个功能的文档,例如malloc(3)printf(3)

答案 4 :(得分:0)

我注意到了几件事。

int dynamic_array(char *input, int *string_current_len) should change to 
int dynamic_array(char **input, int *string_current_len)

因为此函数正在尝试修改指针。  还要调用这里的函数

 if(!dynamic_array(input, &string_len)){
       return 0;
      }

需要:

if(!dynamic_array(&input, &string_len)){
       return 0;
      }