初始化2d动态数组

时间:2013-06-19 09:34:49

标签: c arrays multidimensional-array

我是C的新手并尝试初始化2D数组。我需要数组的两列都是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]);

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分: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值当然可以来自程序中的任何位置,我只是想说明控制内存分配的行数。

答案 1 :(得分:1)

省去麻烦,不要在C中使用2D数组。使用1D数组更方便。

#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);
}