0

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");

セグフォルトが発生しています。ここで何が悪いのか理解できません。誰でも助けてください。

4

2 に答える 2

2

保存したいものに十分なメモリを割り当てていません。この特定のケースでは、次のようになります。

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

配列のサイズを変更するには、次を使用します。

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

詳細(再割り当て)はこちら

于 2009-10-10T19:52:00.437 に答える
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] );
    }
  }
}
于 2009-10-10T20:44:49.690 に答える