当行未知时,对网格进行C动态分配

时间:2009-10-10 19:41:14

标签: c dynamic allocation

我正在尝试在C中分配一个char *的数组。 我事先知道列数,但不知道行数 我想在需要的时候分配行。

我试图使用:

char *(*data)[NUMCOLS]; //declare data as pointer to array NUMCOLS of pointer to char

data = malloc(sizeof(char*));

现在,上面的行应该为data [0]分配...正确吗? 那么,我必须能够使用像

这样的行
data[0][1] = strdup("test");
 .
 ..
data[0][NUMCOLS-1] = strdup("temp");

我遇到了段错误。我无法理解这里有什么问题。 谁能请你帮忙。

2 个答案:

答案 0 :(得分:2)

您尚未为要存储的内容分配足够的内存。在这种特殊情况下,那将是:

data=malloc(sizeof(char*)*NUMCOLS*NUMROWS);

要调整数组大小,您可以使用:

data=realloc(data,(size_t)sizeof(char*)*NUMCOLS*NEW_NUMROWS);

有关它的更多信息(重新分配)here

答案 1 :(得分:0)

我会这样做:

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

int main(){
  char ***a = NULL;

  a       = realloc( a, 1 * sizeof(char **) ); // resizing the array to contains one raw
  a[0]    = malloc(     3 * sizeof(char  *) ); // the new raw will contains 3 element
  a[0][0] = strdup("a[0][0]");
  a[0][1] = strdup("a[0][1]");
  a[0][2] = strdup("a[0][2]");


  a       = realloc( a, 2 * sizeof(char **) ); // resizing the array to contains two raw
  a[1]    = malloc(     3 * sizeof(char  *) ); // the new raw will contains 3 element
  a[1][0] = strdup("a[1][0]");
  a[1][1] = strdup("a[1][1]");
  a[1][2] = strdup("a[1][2]");

  for( int rows=0; rows<2; rows++ ){
    for( int cols=0; cols<3; cols++ ){
      printf( "a[%i][%i]: '%s'\n", rows, cols, a[rows][cols] );
    }
  }
}