[英]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放在最后一行,这样我就可以知道它是否会达到该点,到目前为止还没有。
编辑:我添加了代码。 我必须使用指针算术而不是数组索引。
你的array
中main
被声明为数组int *
指针。 此数组未初始化,即所有元素都包含垃圾值。
在main
FillArray
您的FillArray
调用分层
FillArray(*array, size);
将*array
的值传递给FillArray
函数。 *array
与array[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]
是指向int
的MAX
指针的数组,您可以从中将1st传递给该函数。 后者指向的地方没有定义int
。
要解决此问题,请应用其他答案提供的void FillArray(int *array, int size)
更改,然后像这样调用它:
int main(void)
{
int array[MAX], size = 100;
FillArray(array, size);
return 0;
}
除了您认为* array =&array之外,代码还不错,这是错误的!
以下几点可能有助于更好地低估指针:
对您的代码进行了更改,它应该可以正常工作:
#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.