动态分配内存到2D字符数组

时间:2018-11-07 20:09:03

标签: c malloc c-strings

在确定内存大小时,我正在尝试将内存分配给2d字符数组。 (假定该计数为未知值),直到某些东西开始将垃圾数据重新分配给数组为止,它似乎一直有效

0xd28fe280 -> 3
0xd28fe280 -> 3
0xd28fe280 -> 3
0xd28fe280 -> 3
0xd28fe280 -> ���[U
0xd28fe280 -> ���[U

基本上我想做的就是在用字符串填充数组之前分配内存。

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

int main(){
  int count = 6;
  char **words;
  words = malloc(0);
  for(int i = 0;i < count; i++){
    words[i] = malloc(10);
    strcpy(words[i],"3");
    printf("%#08x -> %s\n",words[0],words[0]);
  }
  free(words);
  return 0;
}

1 个答案:

答案 0 :(得分:1)

它实际上不是2D数组,它是指向字符指针(char **)的指针。

words指向char *的块,其中该块的每个元素都指向char的块。您仅为char块分配了内存,但没有为char *块分配内存。 (您已为其分配了大小0,因此无法访问它)。您还需要释放分配的每个块,否则内存会泄漏。最好检查一下malloc的返回值,因为如果失败,它会返回NULL并进一步取消引用NULL指针将导致不确定的行为。

这应该有效:

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

int main()
{
    int count = 6, max_len = 10, words_n = 0;
    char **words = NULL;

    for(int i=0; i<count; i++)
    {
        words = realloc(words, ++words_n * sizeof *words);
        if(!words)
        {
            //Error handling
            return -1;
        }
        words[i] = malloc(max_len * sizeof *words[i]); 
        if(!words[i])
        {
            //Error handling
            return -1;
        }
        strncpy(words[i], "3", max_len); //Better to protect against overflows.
        words[i][max_len-1] = '\0';
        printf("%p -> %s\n", (void*)words[0], words[0]); //"%p" for printing pointers.
    }

    for(int i=0; i<count; i++)
    {
        free(words[i]); //Free every allocated element.
    }
    free(words);

    return 0;
}