在您认为需要将此标记为重复帖子之前,请不要这样做。我已经阅读了我能找到的指针,数组和函数的所有线程,但几乎所有这些线程都非常先进,对我没有任何帮助。
我没有收到错误,但我的代码不会打印我的数组。看来这里的问题是使用scanf。我不认为输入的值实际上是放在main()中的数组中。我尝试过使用指针,但每当我尝试使用scanf来收集用户输入的值放入数组时,我就会收到错误“Thread 1:EXC_BAD_ACCESS(code = 1,address = 0x0)”。
我正在处理的内容仅限于在main()函数中声明我的数组,但所有操作都在promptData()函数中执行。任何帮助都会很棒,我最终想要自己解决这个问题。
#import <stdio.h>
void promptData(double data[], int numElem);
int main(int argc, const char * argv[])
{
int size, i;
double array[size];
promptData(array, size);
for (i = 0; i < size; i++)
printf("%.2lf\n", array[i]);
return 0;
}
void promptData(double data[], int numElem)
{
int i;
printf("Enter integer values for size of array.\n");
scanf("%i", &numElem);
for (i = 0; i < numElem; i++)
{
printf("Enter array values.\n");
scanf("%lf", &data[i]);
}
}
答案 0 :(得分:1)
您的程序具有未定义的行为,因为可变大小未初始化且具有不确定的值。
你应该首先要求用户输入数组的大小,然后定义数组本身,然后再用数值填充它。
例如
int main(int argc, const char * argv[])
{
int size = 0;
printf( "Enter a positive integer value for the size of the array: ");
scanf( "%i", &size);
if ( size == 0 ) exit( 1 );
double array[size];
promptData(array, size);
//...
同样在C中没有
这样的指令#import <stdio.h>
改为使用
#include <stdio.h>
答案 1 :(得分:0)
您将size
传递给promptData
作为副本。
因此numElem
内promptData
的更改不会影响size
中的main
变量。因此size
仍然未初始化,即具有未定义值,因此不应将其用作数组的大小。
如果需要初始化一个仅在运行时已知的大小的数组,则需要使用malloc
为数组动态 分配内存,例如:
double* array = malloc(size * sizeof(double));
答案 2 :(得分:0)
至少在ANSI C 89
和C 90
中,您无法将变量作为数组的大小。数组的大小应该在编译时知道。你应该做double array[size];
之类的事情。
即使在C99
,您也可以拥有可变大小的数组;声明数组时,变量应包含正确的索引值。在这种情况下,您应该从stdin
读取数字,然后声明数组。
同样在C
中,所有参数均为passed by value
。这意味着每个函数都会获取函数中参数的副本。如果要修改变量的值,则应该将指针传递给它,然后修改指针的解除引用值,如:
void change(int *x)
{
*x = 7;
}
void first(void)
{
int x = 5;
change(&x);
printf("%d\n", x);
}
答案 3 :(得分:0)
添加到另一个,正确,由Zenith回答,如果你想要一个动态分配的数组(就像你希望能够根据用户输入改变它的大小),那么你唯一的选择是使用其中一个内存分配函数,如malloc()
。
一旦你在main函数中实际拥有这个大小,就像这样声明你的数组:
int *myArray = malloc(sizeof(int) * size));//note that malloc will return a NULL if it fails
//you should always check
if(myArray != null) {
//do stuff with myArray like you were. You can just use myArray[] as long as you
//make SURE that you don't go beyond 'size'
}
free(myArray);
//VERY important that every malloc() has a free() with it
注意:未经测试,但想法就在那里。
此外,回答你的另一个问题。
如果您发现自己需要调用某个函数并使用INSIDE函数来更改您调用它的内容,那么您在C中只有两个选择。
您可以返回值并将其分配给调用函数中的变量,如下所示:
int result = myFunction(someVariable, anotherVariable);
//do stuff with result
或者,使用指针。
我不是在这里解释指针,这通常是一些有关信息的讲座,而且是介绍性程序员要掌握的更难的概念之一。我只能告诉你,你需要学习它们,但这种格式不是正确的方法。