为什么不打印?

时间:2015-03-22 07:41:13

标签: c arrays function

在您认为需要将此标记为重复帖子之前,请不要这样做。我已经阅读了我能找到的指针,数组和函数的所有线程,但几乎所有这些线程都非常先进,对我没有任何帮助。

我没有收到错误,但我的代码不会打印我的数组。看来这里的问题是使用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]);
    }
}

4 个答案:

答案 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 作为副本

因此numElempromptData的更改会影响size中的main变量。因此size仍然未初始化,即具有未定义值,因此不应将其用作数组的大小。

如果需要初始化一个仅在运行时已知的大小的数组,则需要使用malloc为数组动态 分配内存,例如:

double* array = malloc(size * sizeof(double));

答案 2 :(得分:0)

至少在ANSI C 89C 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 

或者,使用指针。

我不是在这里解释指针,这通常是一些有关信息的讲座,而且是介绍性程序员要掌握的更难的概念之一。我只能告诉你,你需要学习它们,但这种格式不是正确的方法。