gpt4 book ai didi

c - 为什么 realloc 不更新数组的大小?

转载 作者:行者123 更新时间:2023-11-30 15:06:01 26 4
gpt4 key购买 nike

我正在尝试读取用户输入,然后使用 strtok() 将其解析为标记。这是我的代码:

int main(){
char argv[200];
char** tokenList = NULL;

printf("shell>>");
scanf("%[^\n]%*c", argv);
int len = 0;
char* line = strtok(argv, " ");
while (line != NULL) {
printf("%s\n", line);
printf("%lu\n", sizeof(tokenList) + (sizeof(char*) * (len+1)));
tokenList = realloc(tokenList, sizeof(tokenList) + (sizeof(char*) * (len+1)));
printf("%lu\n", sizeof(tokenList));
char* p = malloc(sizeof(char) * (sizeof(line) + 1));
p=line;
tokenList[len] = p;
len++;
line = strtok(NULL, " ");
}

这三个打印语句用于我的调试目的,我无法弄清楚发生了什么。当我运行 shell 并输入“a b c”时,我的输出如下:

a
16
8
b
24
8
c
32
8

为什么我的数组 tokenList 的大小没有通过 realloc 调用更新?

最佳答案

您正在指针上使用sizeof 运算符。这产生了指针的字节大小,而不是所指向的数据的长度。很容易想象为什么,因为 tokenList 只是一个存储地址的变量,所以您获得的是变量的大小,而不是变量指向的内容。

在 C 中,分配在堆上的数组不知道它们的大小,开发人员必须注意了解它并在必要时在某处存储/更新它。

允许直接使用sizeof的唯一情况是使用静态或本地存储(而不是在堆上)声明数组时。在这种情况下,sizeof返回数组的总长度(以字节为单位),以便您可以执行sizeof(array)/sizeof(array[0])来获取元素计数.

关于c - 为什么 realloc 不更新数组的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39455661/

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