在确定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 -> %sn",words[0],words[0]);
}
free(words);
return 0;
}
它实际上不是一个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] = ' ';
printf("%p -> %sn", (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;
}