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

标签 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;
}

我该如何解决这个问题?

最佳答案

导致崩溃的原因是未定义的行为。将数组传递给函数时,该数组会衰减为该数组第一个元素的指针(内存地址)。好吧,您仍然可以在指针上使用 [] 运算符,但您需要确保 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/

相关文章:

c++ - 创建从父进程标准输入到子进程标准输入的管道

arrays - 创建单个值的数组

Java:同时移动对象

java - 计算字符串中包含某个字符的单词数时得到错误的值

c - 将一个单词插入二维数组

c++ - 如何从c访问cpp类中的结构变量?

java - 如何用一种方法中的数据填充另一种方法中的字符串数组?

arrays - 如果没有该元素则更新

c - 直到 C 中的 EOF 语法

c - Ubuntu 13.04 上的 gcc 编译问题