【问题标题】:C - Segmentation Fault 11 When use the array in functionC - Segmentation Fault 11 在函数中使用数组时
【发布时间】:2017-11-23 21:14:24
【问题描述】:

首先,我查看了有关分段 faut 11 错误的其他标题。

这个离我很近。但不能解决我的问题。 How to fix segmentation fault 11 error

这段代码使用readArray函数从用户那里获取2个数组 这是代码

int *readArray(int p[]) {
  int i = 0;
  printf("Enter the array :\n");
  for (i = 0; i <= 10; i++) {
    printf("a%d : ", i);
    scanf("%d", &p[i]);
  }
  return p;
}

int main() {

  int *firstArray;
  int *secondArray;
  int *resultArray;

  firstArray = readArray(firstArray);
  // printArray(firstArray);

  secondArray = readArray(secondArray);
  // printArray(secondArray);

  // addArray(firstArray,secondArray,resultArray);
  // printArray(resultArray);
  printf("\n");
  return 0;
}

我可以从用户那里获得第一个,但不能获得第二个。它得到错误分段错误 11。

我该如何解决?

谢谢大家! 固定代码

 void readArray(int p[]) {
  int i = 0;
  printf("Enter the array :\n");
  for (i = 0; i < 11; i++) {
    printf("a%d : ", i);
    scanf("%d", &p[i]);
  }

}

int main() {

  int firstArray[11];
  int secondArray[11];
  int resultArray[11];

  readArray(firstArray);
  // printArray(firstArray);

  readArray(secondArray);
  // printArray(secondArray);

  // addArray(firstArray,secondArray,resultArray);
  // printArray(resultArray);
  printf("\n");
  return 0;
}

【问题讨论】:

  • 为数组分配一些内存怎么样?
  • 其实 11 元素对我来说还可以。但我不能将它作为数组发送给函数,所以我使用指针。
  • 目前是 0 元素。
  • 尾巴试图摇狗。 readArray 返回它传递的同一个指针,将它分配给传递的指针是没有用的。
  • 亲爱的@EugeneSh。你是说,我必须myArray = (int *) malloc(11); 11 个整数?

标签: c segmentation-fault


【解决方案1】:

您的firstArraysecondArrayresultArray 指针都未初始化,因此尝试访问readArray() 中的p[i] 是未定义的。

代替:

int * firstArray;
int * secondArray;
int * resultArray;

你可以使用:

int firstArray[11];
int secondArray[11];
int resultArray[11];

如果你真的想动态分配内存,那么你就必须改用malloc()

int * firstArray = malloc(sizeof(int) * 11);
int * secondArray = malloc(sizeof(int) * 11);
int * resultArray = malloc(sizeof(int) * 11);

在你用完之后删除它们:

free(firstArray);
free(secondArray);
free(resultArray);

顺便说一句,由于您将数组(或指针)传递给readArray() 并修改其内容,因此您不需要返回任何内容。定义void readArray(int p[]) {...}(或void readArray(int * p) {...},如果您使用指针)就足够了。

【讨论】:

  • @mehmetsalihbindak 除了:请尽量避免使用幻数。数组长度为 11,但您在循环 for (i = 0; i &lt;= 10; i++) 中使用 10。这使得代码更难遵循和维护。使用const int#define 作为数组长度并从中驱动一切。所以(假设将定义 11)循环应该是for (i = 0; i &lt; 11; i++)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 2013-04-29
  • 2014-03-25
  • 1970-01-01
相关资源
最近更新 更多