1

我是 C 新手,正在尝试初始化一个二维数组。我需要数组的两列都是 char *,因为它们将包含字符串值。

我让它与存储整数的数组一起工作,但由于某种原因,当我尝试在打印时存储字符串值时,它显示(null). 下面是我如何初始化数据并将数据存储为 int 的代码(这似乎有效)。

int **array;
    int row = 0;

    array = malloc(2 * sizeof(int*));
    int i;
    for (i = 0; i < 2; i++)
    {
        array[i] = malloc(2 * sizeof(int));
    }

    array[0][0] = i;
    array[0][1] = i;

    printf("array[0][0]: %i\n", array[0][0]);

下面是我如何执行上述操作,但使用字符串值。

char **array;
int row = 0;

array = malloc(2 * sizeof(char*));
int i;
for (i = 0; i < 2; i++)
{
    array[i] = malloc(2 * sizeof(char*));
}

array[0][0] = "Test[0][0]";
array[0][1] = "Test[0][1]";

printf("array[0][0]: %s\n", array[0][0]);

感谢您的任何帮助,您可以提供。

4

2 回答 2

3

您的指针间接级别错误,这使事情变得过于复杂。

如果您将数组视为结构数组,我认为对您来说会更容易,每个结构都包含两个指针:

struct row {
  char *column1;
  char *column2;
};

那么(希望)更清楚的是,一旦你分配了一个数组struct row,你在每行中两个指针,你不需要为指针本身分配空间。

const size_t num_rows = 1;
struct row * rows = malloc(num_rows * sizeof *rows);
if(rows != NULL)
{
  rows[0].column1 = "row 0, column 1";
  rows[0].column2 = "row 1, column 2";
}

请注意,这使用字符串文字,否则您可能需要为要存储的字符串分配空间,具体取决于数据的来源。

num_rows值当然可以来自程序中的任何位置,我只是想说明什么控制了分配内存的行数。

于 2013-06-19T09:38:56.350 回答
1

省去麻烦,不要在C中使用二维数组。使用一维数组更方便。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    const int nstrings = 2;
    const int width = 20; //width of maximum string.

    char* array = (char*)malloc(sizeof(char)*nstrings*width);
    strcpy(&array[0*width],"Test[0][0]");
    strcpy(&array[1*width],"Test[1][0]");
    printf("string 0: %s\n", &array[0*width]); 
    printf("string 1: %s\n", &array[1*width]);
    free(array);
}
于 2013-06-19T09:58:51.683 回答