动态地将指针分配给数组

时间:2013-05-30 21:45:53

标签: c memory-management

我一直在寻找并尝试运行简单的测试程序,但我仍然无法弄清楚这一点:

在纯C中,是否有可能动态分配指向数组的指针?

我想要完成的是将字符串复制到char [20]数组,但这些char数组的数量是未知的。我声明的变量是

char (*value)[20]

据我所知,这是一个指向20个字符数组的指针,这就是我需要的

但是,如何为此变量分配内存?我怎么能动态地做它,我不知道将存在的char [20]的数量?我是否认为这是我设计问题的解决方案?

感谢。

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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
}

答案 2 :(得分:0)

这是一个将常量字符串写入值num_arrays次指向的数组数组的示例。

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