我遇到了我创建的函数的问题。这是一个代码示例:
#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_array
在0x0
中的值为my_function
。我想这就是分段错误的原因。
我是对的吗?如果是这样,我该如何解决?如果没有,那么问题是什么呢?
答案 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.h
和stdlib.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:数组的名称不是指针。