为什么这个C代码段错误?

时间:2014-02-11 18:43:05

标签: c pointers segmentation-fault

我在这段代码中一直遇到分段错误:

#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放在最后一行,这样我就知道它是否会到达那一点,到目前为止还没有。

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

6 个答案:

答案 0 :(得分:2)

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

FillArray

中对main来电进行分层
FillArray(*array, size);

*array的值传递给FillArray函数。 *arrayarray[0]相同 - 它是一个未初始化的未初始化垃圾指针。

FillArray函数内部,您试图通过未初始化的垃圾指针访问(和写入)数据。预计代码会崩溃。

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

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

答案 1 :(得分:1)

如果要填充传递给您的函数的数组,请更改

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 

答案 2 :(得分:1)

你的循环应该是:

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是无符号整数),只要总和当然是指针。

main()也有错误:

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

答案 3 :(得分:0)

可能是你想要的。

#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;
    }
}

答案 4 :(得分:0)

int *array[MAX]是一个MAX 指向int 的数组,您可以从第1个函数传递给函数。后面指出的没有int已定义

要解决此问题,请修改其他答案提供的更改void FillArray(int *array, int size),然后将其称为:

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

答案 5 :(得分:0)

代码很好,除了你认为* array =&amp; array,这是错误的!!

以下几点可能有助于更好地低估指针:

  1. * array = array [0]
  2. array =&amp; array [0]
  3. *(array + i)= array [i]
  4. 对代码进行了更改,它应该可以正常工作:

    #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");
    }