通过函数

时间:2016-02-09 04:30:49

标签: c pointers multidimensional-array

我正在尝试将数据写入一个可变长度的二维数组,当我调用myfunc时,我的程序会保持seg-faulting,但是当我尝试在函数外执行相同的操作时,它工作正常。我可以说问题是数组[0]指向的地址不等于数据[0]指向的地址。有人可以告诉我这个问题的根本原因以及重写myfun的正确方法。

void myfun(unsigned char **array){
    printf("array = %p, array[0] = %p\n", array, array[0]);
    //This line below causes a segfault
    strcpy(array[0], "Position0");
}

int main(void) {
    int row = rand() % 5 + 1;   // random number between 1-5
    int col = rand() % 10 + 20;   // random number between 20-29
    unsigned char data[row][col];

    printf("data = %p, data[0] = %p\n", data, data[0]);

    //This function call causes a segfault
    myfun(data);
    printf("%s\n", data[0]);

    //This works
    strcpy(data[1], "Position1");
    printf("%s\n", data[1]);

    return 0;
}

2 个答案:

答案 0 :(得分:3)

由于您明显使用C99或更高版本以及支持VLA(可变长度数组)的编译器,因此您可以非常轻松地正确编写函数:

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

static void myfun(int rows, int cols, char array[rows][cols])
{
    printf("array = %p, array[0] = %p\n", array, array[0]);
    strcpy(array[0], "Position0");
    printf("a[0] = [%s]\n", array[0]);
}

int main(void)
{
    int row = rand() % 5 + 1;   // random number between 1-5
    int col = rand() % 10 + 20;   // random number between 20-29
    unsigned char data[row][col];

    printf("data = %p, data[0] = %p\n", data, data[0]);

    myfun(row, col, data);
    printf("%s\n", data[0]);

    strcpy(data[1], "Position1");
    printf("%s\n", data[1]);

    return 0;
}

答案 1 :(得分:1)

问题是功能定义。如果你想以你的方式传递矩阵,你必须动态分配它,但这是另一个故事。我会解释错误。

C语言实际上将静态矩阵实现为一个大小为row * col的单个数组。这是为了提高效率。

当你将静态矩阵传递给那个函数时,你遇到了一个问题:它需要一个双指针,但你传递的实际上是一个需要列数的指针。你必须这样写:

void myfun(unsigned char array[][col]){ ...

你应该如何定义它,其中 col 是列数。

问题是你不知道列的数量,它是变量,所以我建议你使用malloc或calloc来分配一个动态矩阵。

编辑:查看 n.m。发布的评论链接,了解有关C实现的静态矩阵的详细信息:Is 2d array a double pointer?