繁体   English   中英

为什么会出现此C代码段错误?

[英]Why does this C code segfault?

我在此代码中不断出现细分错误:

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

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

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

main FillArray您的FillArray调用分层

FillArray(*array, size);

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

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

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

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

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

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 

您的循环应该是:

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);

可能是您想要的。

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

int *array[MAX]指向intMAX 指针的数组,您可以从中将1st传递给该函数。 后者指向的地方没有定义int

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

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

除了您认为* array =&array之外,代码还不错,这是错误的!

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

  1. *数组=数组[0]
  2. 数组=&array [0]
  3. *(array + 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");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM