通过引用函数传递数组时出错

时间:2014-05-23 13:29:45

标签: c arrays

我正在尝试创建一个程序,将数组的反转放入另一个数组中。所以,我做了相反的功能。并通过数组来反转值。并且数组用于通过引用存储反向。但是当我运行该程序时它会崩溃。

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

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

首先,C中没有参考文献 其次,您通过指针传递两个数组 第三,将#define size 50更改为#define size 3或将数组长度传递给函数,否则访问其边界外的数组是错误的。

答案 1 :(得分:0)

导致崩溃的原因是未定义的行为。将数组传递给函数时,该数组会衰减为该数组的第一个元素的指针(内存地址)。很好,您仍然可以在指针上使用[]运算符,但是由您来确保a_ptr[123]仍然有效,并且可访问的内存
如果不是任何事情都可能发生。这就是为什么它被称为未定义的行为。

如果reverse[0]的内存地址为0x04sizeof(int)为4,则reverse[-1] = 123与写入*((int *) 0) = 123;相同。这是教科书未定义的行为(取消引用NULL指针!) more on this matter

您正在访问您不拥有的内存,超出范围的内存:您的阵列定义为3长,但您使用size宏进行循环(应该是case,BTW),这是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])
);

答案 2 :(得分:0)

它没有崩溃,因为数组索引是负数。 num2[3-1-i]归结为*(num2+3-1-i),这很好。它崩溃的原因是因为它正在访问内存的受保护区域而操作系统无法允许这样做。由于numreverse每个都分配了3个整数,因此您将走出数组(在num1中,索引大于2;在num2中,索引小于0)并且您不知道为您分配的内存之外的内容。如果它正在访问某个受保护区域,它将崩溃。如果你很幸运,它可能不会崩溃。但你不应该这样做。正如其他人所说的那样,将size更改为3,就可以了。