2

簡単なテストプログラムを検索して実行しようとしましたが、まだこれを理解できません:

純粋なCで、配列を指すポインターを動的に割り当てることは可能ですか?

私が達成したいのは、文字列を char[20] 配列にコピーすることですが、これらの char 配列の数は不明です。私が宣言する変数は

char (*value)[20]

私が理解していることから、これは20文字の配列へのポインターであり、これが必要です

ただし、この変数にメモリを割り当てるにはどうすればよいですか? 存在するchar [20]の数がわからない場合、動的に行うにはどうすればよいですか? これが私の設計上の問題の解決策であると考えるのは間違っていますか?

ありがとう。

4

3 に答える 3

1

サイズが大きくなる配列が必要な場合は、たとえば、すべての文字列が正確に20 文字になることがわかっている場合、メモリを動的に割り当てる以外に選択肢はありません。

#define STR_SIZE 20
char* values = NULL;
int nb = 0;

...

// Called every time a string is received
// Here valuesPtr is a char** since we want to change values
void appendStr(char** valuesPtr, int* nb, char* string) {
    if (*nb == 0) {  // First item
        *valuesPtr = malloc(STR_SIZE);
    } else {  // The size of the array changes : realloc it
        *valuesPtr = realloc(*valuesPtr, STR_SIZE * (*nb + 1));
    }

    if (*valuesPtr == NULL) {  // Something went wrong !
        perror("malloc/realloc");
        exit(1);
    }

    // Copy the new string at the right place
    memcpy(*valuesPtr + STR_SIZE * (*nb), string, STR_SIZE);
    *nb++;
}

コードの残りの部分では、n 番目の文字列へのアクセスは次のように行われます。

values + (STR_SIZE * nb)
于 2013-05-30T22:08:11.513 に答える
1

通常、文字列の配列を使用します。

char *strings[256]; // or use malloc/realloc but 256 pointers is OK
int cnt = 0;
void add_string(const char *s) {
   strings[cnt] = (char*)malloc(strlen(s)+1); // or 21
   cnt++;
   // you can also do circular buffers
}
于 2013-05-30T22:11:38.907 に答える
0

num_arrays以下は、value timesが指す配列の配列に定数文字列を書き込む例です。

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

void func(int num_arrays)
{
  const char* s = "A string";
  char (*value)[20];
  value = (char (*)[20]) malloc(sizeof(*value) * num_arrays);
  int i;
  for(i = 0; i < num_arrays; i++) {
    strncpy(value[i],s,20);
  }
  for(i = 0; i < num_arrays; i++) {
    printf("%s\n", value[i]);
  }
}
于 2013-05-30T22:04:18.873 に答える