我正在尝试读入用户输入,然后使用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调用更新?
答案 0 :(得分:1)
您在指针上使用sizeof
运算符。这会产生指针的字节大小,而不是指向的数据长度。很容易想象为什么,因为tokenList
只是一个存储地址的变量,所以你获得变量的大小,而不是变量指向的大小。
在C中,在堆上分配的数组不知道它们的大小,开发人员必须注意知道它并在必要时在某处存储/更新它。
允许直接使用sizeof
的唯一情况是使用静态或本地存储(而不是堆)声明数组。在这种情况下,sizeof
返回数组的总长度(以字节为单位),以便您可以sizeof(array) / sizeof(array[0])
获取元素数。