【问题标题】:Segmentation error while returning a pointer from an array using malloc() in C在 C 中使用 malloc() 从数组返回指针时出现分段错误
【发布时间】:2020-08-29 23:21:54
【问题描述】:

也许这是一个愚蠢的问题,但我是 C 的新手。我正在尝试使用 malloc 从函数返回一个指针。我用strtok做了一个数组。这是我试图从中返回指针的函数的代码:

int *data(){
    
  int longi=0, *array=(int *) malloc(4 * sizeof(int));
  char buffer[1024];     
  char *aux;       
  printf("Enter if approved(A) or failed (F) separated by a comma \",\": \n");
  fgets(buffer,1023,stdin); 
  aux=strtok(buffer, ","); 
  while(aux)                 
  {
      array[longi]=aux; 
      longi++;                 
      aux=strtok(NULL, ","); 
  } 

  printf("%s", array[0]);
  return array;
}

这是我的主要功能:

int main(){
  int *arr=data();
  printf("%s",arr[0]); /*segmentation error */
  return 0;
}

【问题讨论】:

  • aux;char *,而 array[longi]int。为什么要分配一个指向 int 的指针?
  • 您的array 指针指向buffer 的某些部分,在您的函数调用后不再存在。
  • 您在查看编译器警告吗?请使用-Wall -Werror 编译。编译器几乎会告诉你所有与我们相同的事情。如果您干净地编译所有内容但仍然存在段错误,则使用-ggdb3 构建并使用 valgrind 或 gdb,它会告诉您问题所在。
  • 最好先使用字符缓冲区char* array = (char*)malloc(4 * sizeof(char));,然后再使用array[longi] = *aux,当然您还必须将printf 语句更改为printf("%c\n", arr[0]); 或类似的东西。
  • 更好,don't cast malloc in C programs ;无论是在 OP 的原始代码中,还是在此页面上的其他任何地方。无论如何,您有更紧迫的问题,这里有足够的东西强烈敦促good book on C programming 作为参考点。

标签: arrays c malloc


【解决方案1】:

发生分段错误是因为您试图将数组的一部分打印为字符串 (%s)。使用 %d 或 %c (使用字符转换)时,它不会给出该错误。 但是,它仍然没有意义,因为您试图将指向字符串开头的指针放在整数数组中。我建议分配一个字符数组而不是整数,并确保在 aux 中有一个字符,然后将其添加到数组中。您还需要确保您接受的不同字符不超过 4 个,否则您可能仍然会出现缓冲区溢出。

【讨论】:

  • 感谢您的帮助,您是对的。现在我没有任何分段错误,但我根本没有任何字符。
  • 你有一个指向你得到的字符串的指针,所以你可以使用 *aux 得到它的第一个字符
【解决方案2】:

当标志为 %s 时,printf 正试图从分配的内存中读取字符串,你给出一个整数,所以这就是它给出段错误的原因 替换数组[longi]=aux;用数组[longi]=atoi(aux); atoi 将从字符串转换为整数,并且对于两个 printfs 都将 %s 替换为 %d

【讨论】:

  • 我认为问题在于数组条目指向的缓冲区不再有效,因为他只想要一个字符,您可以简单地执行array[longi]=*aux; 而不是使用atoi() 之类的东西。
  • 我着急,我以为他需要一个整数,所以他只需要一个字符,你是对的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 2021-12-22
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
相关资源
最近更新 更多