我正在尝试编写一个程序,将一个数组的反转放入另一个数组中。因此,我创建了一个函数来执行相反的操作。并传递了要按值反转的数组。以及用于通过引用存储反向的数组。但是当我运行该程序时它崩溃了。
#include <stdio.h>
#include <conio.h>
#define size 50
void revarr (int num1[], int *num2)
{
int i;
for (i = 0; i<size; i++)
{
num2[3-1-i] = num1[i];
}
}
int main()
{
int num[] = {1,8,1};
int reverse[3],x;
revarr(num,reverse);
for (x = 0; x<3; ++x)
printf("%d ", reverse[x]);
getch();
return 0;
}
我该如何解决这个问题?
最佳答案
导致崩溃的原因是未定义的行为。将数组传递给函数时,该数组会衰减为该数组第一个元素的指针(内存地址)。好吧,您仍然可以在指针上使用 []
运算符,但您需要确保 a_ptr[123]
仍然有效且可访问内存。
如果不是的话,什么都可能发生。这就是为什么它被称为未定义行为。
如果reverse[0]
的内存地址是0x04
,并且sizeof(int)
是4,那么reverse[-1] = 123
与编写相同:*((int *) 0) = 123;
。这是教科书上的未定义行为(取消引用 NULL 指针!)。
more on this matter
您正在访问不属于您的内存,超出范围的内存:您的数组被定义为 3 长,但您正在使用 size
宏(应该是大写)进行循环,顺便说一句),这是 50。这是不允许的,因此会崩溃。更改 revarr
函数以采用第三个参数,指定要反转的数组的长度,并确保您传递的两个数组都足够大以容纳数据:
#include <stdio.h>
#include <stdlib.h>
void rev_array(int *to, int *from, size_t max)
{//arrays decay into pointers
int i,j;
for (i=max-1, j=0;j<max;--i,++j)
to[j] = from[i];
}
int main ( void )
{
int i,
reverse[3],
num[] = {1,2,3};
rev_array(reverse, num, 3);
for(i=0;i<3;++i)
printf("%d -> %d\n", num[i], reverse[i]);
return EXIT_SUCCESS;
}
如您所见here ,效果非常好。
当然,您可以使用 sizeof
获取数组的大小,而不是对 3 进行硬编码(注意:sizeof
适用于数组,而不是指针!):
rev_array(
reverse,
num,
sizeof num/sizeof *num
//or sizeof(num)/sizeof(num[0])
);
关于c - 通过引用函数传递数组时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23830568/