2

我正在学习如何在 C 中使用动态数组。我想做的是创建一个动态数组data,并使用函数将“1”放入第一个条目test()

void test(void)
{

data[0] = 1;

}


int main(void)
{

int *data = malloc(4 * sizeof *data);

test();

return 0;
}

这在 Visual Studio 2010 中编译,但程序在运行时崩溃。而不是 using test(), usingdata[0] = 1作品。

我(新手)的猜测是我需要将指针传递data给 function test()。我该怎么写这个?

试图

void test(int *data)
{

data[0] = 1;

}

然后,在main使用中test(data)而不是仅仅test().

编辑

尝试有效。但是,这是一种“正确”的做法吗?

4

3 回答 3

2

当您在 C 中使用局部变量(动态或静态、数组或非数组)时,您需要将其传递给将要使用它的函数。这就是您的初始代码有什么问题,test()data.

当您声明一个数组(动态或静态)时,您可以以相同的方式将其传递给函数。下面的代码毫无意义,但它说明了使用动态数组与静态数组并没有什么不同。

void assign_function(int arr[], int len_of_arr, int *arr2, int len_of_arr2);
void print_function(int *arr, int len_of_arr, int arr2[], int len_of_arr2);

int main()
{
    int data[2] = {0}; // static array of 2 ints
    int *data2 = malloc(3 * sizeof(int)); // dynamic array of 3 ints

    assign_function(data, 2, data2, 3);
    print_function(data2, 3, data, 2);

    free(data2); // One difference is you have to free the memory when you're done

    return 0;
}

所以我们可以传递数组,无论是动态的还是静态的,通过array[]或作为指针,但我们也需要传递一个int,这样我们才能知道数组有多大。

void assign_function(int arr[], int len_of_arr, int *arr2, int len_of_arr2)
{
    int count;
    for(count = 0; count < len_of_arr; count++) //This is the static array
        arr[count] = count;

    for(count = 0; count < len_of_arr2; count++) //This is the dynamic array
        arr2[count] = count;
}

然后只是为了好玩,我反转了传入的数组arrarr2这里,以及它们是如何访问的:

void print_function(int *arr, int len_of_arr, int arr2[], int len_of_arr2)
{
    int count;
    for(count = 0; count < len_of_arr; count++)   //This is the dynamic array now
        printf("arr[%d] = %d\n", count, *(arr+count));

    for(count = 0; count < len_of_arr2; count++)  //And this is the static array
        printf("arr2[%d] = %d\n", count, *(arr2+count));
}

指向,通过[]或作为指针传递,以及通过[]或引用指针访问取决于您,两者都很好,都可以工作。我尽量避免使用指针,因为它们往往难以阅读并且在编写时更容易出错。

于 2012-12-06T15:20:27.327 回答
1

您可以通过两种方式动态传递数组:

  • 使用简单的指针,然后使用指针算法来操作
void test (int * data, int i)
{
    *(data + i) = 1; //This sets data[i] = 1
}
  • 或者这样:
void test(int data[], int i)
{
    data[i] = 1; //This is the more familiar notation
}

这些方法中的任何一种都是解决此问题的“正确”方法。

于 2012-12-06T14:51:23.700 回答
0

测试中的变量“数据”是本地范围的。它与主要的“数据”不同。您应该通过 test() 的参数传递一个指向“数据”的指针。

于 2012-12-06T14:49:55.857 回答