在确定内存大小时,我正在尝试将内存分配给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;
}
答案 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;
}