我是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]);
感谢您提供的任何帮助。
答案 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);
}