gpt4 book ai didi

c - 动态分配内存给二维字符数组

转载 作者:行者123 更新时间:2023-11-30 19:03:59 25 4
gpt4 key购买 nike

我在确定二维字符数组的大小时尝试将内存分配给它。 (假设计数是一个未知值)它似乎一直有效,直到某些东西开始将垃圾数据重新分配给数组

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;
}

最佳答案

它实际上不是一个二维数组,它是一个指向字符指针(char **)的指针。

words 指向一个 char * block ,其中该 block 的每个元素都指向一个 char block 。您只为 char block 分配了内存,但没有为 char * block 分配了内存。 (您已经为其分配了大小 0,因此您无法访问它)。您还需要释放分配的每个 block ,否则内存会泄漏。检查 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;
}

关于c - 动态分配内存给二维字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53197071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com