为什么我的数组在作为参数传递时被删除?

时间:2014-11-28 10:50:01

标签: c arrays function memory-address

我遇到了我创建的函数的问题。这是一个代码示例:

#include <stdio.h>    // EDIT
static void my_function(int size, float my_array[size+1]);
int main(void)
{
    int size = 3, i;
    float my_array[size+1];
    for(i=0;i<=size;i++)
        my_array[i]=0.5;
    my_function(size, my_array);
    return EXIT_SUCCESS;
}
static void my_function(int size, float my_array[size+1])
{
    printf("my_array[0] = %f\n", my_array[0]);    // Segmentation fault here !
}

经过一些调试和一些研究后,我发现my_array0x0中的值为my_function。我想这就是分段错误的原因。

我是对的吗?如果是这样,我该如何解决?如果没有,那么问题是什么呢?

4 个答案:

答案 0 :(得分:1)

你错过了文件中的stdio.h标题,这是另一种有趣的方式来做你原本想做的事情

#include <stdio.h>
static void my_function(int size, float *my_array);
int main(void)
{
    int size = 3, i;
    float my_array[size+1];
    for(i=0;i<=size;i++)
        my_array[i]=0.5;
    my_function(size, my_array);
    return 0;
}
static void my_function(int size, float *my_array)
{
    printf("my_array[0] = %f\n", my_array[0]);    // No Segmentation fault now, using array indexes!
    printf("*(my_array) =%f\n", *(my_array));     //Using de-reference method
}
编辑:我使用gcc运行原始代码,并且正如@davmac建议的那样,问题确实是stdio.h头文件没有包含在内。但是上面使用的方法是安静的,也有利于理解

答案 1 :(得分:1)

你的程序不是标准的C.好吧它编译并运行gcc(一旦你添加了相关的包括stdio.hstdlib.h),但它甚至无法编译得更严格编译器。

在以下声明中:

float my_array[size+1];

数组的大小是一个变量。 C要求它是一个常量表达式。从Gnu C参考手册:另一个GNU扩展允许您使用变量声明数组大小,而不是仅使用常量

您的职能声明:

static void my_function(int size, float my_array[size+1])

也不是标准C.在标准C中,您应该写:

static void my_function(int size, float my_array[])

static void my_function(int size, float *my_array)

Gnu C接受它(甚至数组上的sizeof),但它可能会产生误导。我修改了你的功能:

static void my_function(int size, float my_array[size+1])
{
    int i = sizeof(my_array);
    printf("size : %d/%d : %d\n", i, sizeof(float), i/sizeof(float));
    printf("my_array[0] = %f\n", my_array[0]);    // Segmentation fault here !
}

结果是:

size : 8/4 : 2
my_array[0] = 0.500000

我真的不知道gcc在哪里找到了它的大小,但它你能期待什么。

所有这些意味着从C语言的角度来看,编译器可能会引发错误,即使它们没有,也可能会有未定义的行为。

答案 2 :(得分:0)

after fixing all the compiler warnings 
all warnings really need to be enabled during the compile step
and all warnings really do need to be fixed
then using a float value, rather than a double value to init the array
then the following code compiles cleanly

#include <stdio.h>
#include <stdlib.h>

static void my_function(float *my_array);

#define SIZE (4)

int main()
{
    float my_array[SIZE] = { 0.5f, 0.5f, 0.5f, 0.5f };

    my_function(my_array);

    return EXIT_SUCCESS;
} // end function: main

static void my_function(float *my_array)
{
    printf("my_array[0] = %f\n", my_array[0]);
} // end function: my_function

答案 3 :(得分:-3)

像这样写: void my_function(int size,float * my_arr); 当您将数组的名称作为参数传递给函数时,该函数将其用作指针。因此,您可以将指针编写为参数。 PS:数组的名称不是指针。