【问题标题】:Why does this C code segfault?为什么这个 C 代码会出现段错误?
【发布时间】:2014-02-11 18:43:05
【问题描述】:

我在这段代码中不断遇到分段错误:

#include <stdio.h> 

void FillArray(int *array, int);
#define MAX 256

int main()
{
    int *array[MAX], size = 100;
    FillArray(*array, size);
    return 0;
}

void FillArray(int *array, int size)
{
    int i, temp;
    for (i = 0; i < size; i ++)
    {
        temp = (rand()%101);
        *array = temp;
        printf ("array[%d]. %d\n", i, *array);
        array += i;
    }
    printf ("AJGIUEROGUSHFDJGJDFK/n");
}

我把 printf 放在最后一行,这样我就可以判断它是否会达到那个点,到目前为止还没有。

编辑:我添加了代码。我必须使用指针算法而不是数组索引。

【问题讨论】:

  • int *array[MAX]MAX 指向 int 的数组,您可以从中将第一个传递给函数。 没有定义ints,后者指向。
  • (P.S. it's in C) -- 你标记了问题C,在标题和帖子本身中提到了C code。哇!
  • 啊,那是我自己的愚蠢
  • 开启编译器编译器警告。阅读它们。这本来很容易找到。
  • 现在做作业了吗? :P

标签: c pointers segmentation-fault


【解决方案1】:

main 中的 array 被声明为 int * 指针数组。该数组未初始化,即所有元素都包含垃圾值。

将您的FillArray 呼叫分层main

FillArray(*array, size);

*array 的值传递给FillArray 函数。 *arrayarray[0] 相同 - 它是一个未初始化的垃圾指针,没有指向任何地方。

FillArray 函数中,您正试图通过那个未初始化的垃圾指针访问(和写入)数据。不出所料,代码崩溃了。

与无效代码的情况一样,在您解释您要执行的操作之前,无法修复错误。

我只能猜测您需要的只是int 元素的数组,而不是int * 元素。 IE。 main 中的 array 应该被声明为 int array[MAX]。而FillArray 应该被称为FillArray(array, size)。此外,在循环内它应该是array += 1(或只是++array),而不是你的array += i,这没有任何意义。

【讨论】:

  • 我正在尝试“创建一个名为 FillArray() 的函数,它接受一个指向整数的指针作为数组名称,一个整数表示其大小。这个函数随机填充数组,整数范围从 0 到100. 使用指针算法”。
  • @Fredamabob:见我回答的最后一段。
【解决方案2】:

如果想填充传递给你的函数的数组,那么改变

array = &temp; 

*array = temp; 

还有变化

array += i;  

array++;  

编辑:OP 编辑​​了他的问题并想要填充一个整数数组。您需要更改数组的声明

 int *array[MAX], size = 100;  // Declare an array of pointers

 int array[MAX], size = 100;   // Declates an array of ints 

【讨论】:

  • 当我这样做时,我的程序会立即崩溃,而不是像通常那样输出数组的所有值然后崩溃。
  • @Fredamabob 另一个(现在正在崩溃的)错误在array += i
  • 投反对票的人可能想解释一下:假设函数会被正确调用,这个答案很好。
  • @alk;在 SO 上,一些反对者不喜欢解释 :)。
【解决方案3】:

你的循环应该是:

int i, temp;
for (i = 0; i < size; i ++)
{
    temp = rand() % 101;
    array[i] = temp;
    printf ("array[%d] = %d\n", i, array[i]);
}

这会做你想做的事。无需在函数内部重新分配array,尽管您可以。只使用索引运算符[] 会更容易。请记住

a[i]

相同
*(a + i)

不管涉及的类型(但通常a 是指针类型,i 是无符号整数)当然只要 sum 是指针。

main()也有错误:

  • 数组应该只是int array[MAX];
  • 电话应该是FillArray(array, size);

【讨论】:

  • 对不起,我忘了包括我必须使用指针算术
  • array 中的FillArray 是垃圾指针时,这有什么帮助?
【解决方案4】:

可能是你想要的。

#include <stdio.h> 
#include <stdlib.h>

void FillArray(int *array, int);
#define MAX 256

int main(){
    int array[MAX], size = 100;
    FillArray(array, size);
    return 0;
}

void FillArray(int *array, int size){
    int i;
    for (i = 0; i < size; i++){
        *array = rand()%101;
        printf ("array[%d]. %d\n", i, *array);
        ++array;
    }
}

【讨论】:

    【解决方案5】:

    int *array[MAX]MAX 指向int 的数组,您可以从中将第一个传递给函数。后者所指向的没有定义ints

    要解决此问题,请应用其他答案提供的更改 void FillArray(int *array, int size),然后像这样调用它:

    int main(void)
    {
      int array[MAX], size = 100;
      FillArray(array, size);
      return 0;
    }
    

    【讨论】:

      【解决方案6】:

      代码很好,只是你认为 *array = &array 是错误的!!

      以下几点可能有助于更好地理解指针:

      1. *array = array[0]
      2. 数组 = &array[0]
      3. *(数组+i) = 数组[i]

      对您的代码进行了更改,它应该可以正常工作:

      #include <stdio.h> 
      
      void FillArray(int *array, int);
      #define MAX 256
      
      int main()
      {
          int *array, size = 100;
          array=(int *)calloc(MAX,sizeof(int));
          if(array !=NULL)
          {
              FillArray(array, size);    /* While calling send &array[0] but not array[0] */
          }
          return 0;
      }
      
      void FillArray(int *array, int size)
      {
          int i, temp;
          for (i = 0; i < size; i ++)
          {
              temp = (rand()%101);
              *(array+i) = temp;
              printf ("array[%d]. %d\n", i, *(array+i));
              /* array += i;             <-- not necessary */
          }
          printf ("AJGIUEROGUSHFDJGJDFK/n");
      }
      

      【讨论】:

        猜你喜欢
        • 2013-03-28
        • 1970-01-01
        • 2010-10-19
        • 2020-07-26
        • 2011-12-27
        • 1970-01-01
        • 2018-02-23
        • 1970-01-01
        相关资源
        最近更新 更多