为什么realloc不会更新我的数组的大小?

时间:2016-09-12 17:28:33

标签: c arrays memory malloc realloc

我正在尝试读入用户输入,然后使用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调用更新?

1 个答案:

答案 0 :(得分:1)

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

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

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