【问题标题】:Sizeof output is not as expectedSizeof 输出不符合预期
【发布时间】:2022-01-16 10:50:06
【问题描述】:
#include<stdio.h>
#include <string.h>

int main() {
   char str[400] = "rQvqQmyl9N9FmI8ECESs0N2dKBATuIrvT4HEh0lRa+6kGHIP0owiFqFdlvktmOQMTdZ5gW44G2O6T2uQGlIeeobnyYuZscLadvyM5tkzb1MhEmBoIuCp8db9GZ8SBBMnoDIWNi9Ad6pRzBpcxmobWJnJo3O6BQ/Kii03RMfXVEw5No7n576J0blLPirrH6M7OaIp7qcrT7hD4qHkGIKjoAcGLsu0c5Ii2r+lOnFE1zgMPZtw8+QoHBp/lzFH5LyB973e+k9B5T3UO/L7xM6h8ZN4ufXibM385PdzPuwZ3NbmZRCSpIrvGNyUSZo0/mcPuzt6KuoQpNLYt9Avmi";
   // Extract the first token
   char * token = strtok(str, " ");
   printf( " %s\n", token ); //printing the token
   printf("%lu \n", sizeof(token));
   return 0;
}

输出 rQvqQmyl9N9FmI8ECESs0N2dKBATuIrvT4HEh0lRa + 6kGHIP0owiFqFdlvktmOQMTdZ5gW44G2O6T2uQGlIeeobnyYuZscLadvyM5tkzb1MhEmBoIuCp8db9GZ8SBBMnoDIWNi9Ad6pRzBpcxmobWJnJo3O6BQ / Kii03RMfXVEw5No7n576J0blLPirrH6M7OaIp7qcrT7hD4qHkGIKjoAcGLsu0c5Ii2r + lOnFE1zgMPZtw8 + QoHBp / lzFH5LyB973e + k9B5T3UO / L7xM6h8ZN4ufXibM385PdzPuwZ3NbmZRCSpIrvGNyUSZo0 / mcPuzt6KuoQpNLYt9Avmi P>

8

为什么令牌的大小是 8 ? 它应该是令牌的长度。

【问题讨论】:

  • sizeof(token) 是指针的大小。请使用strlen()
  • 这段代码说明了数组和指针之间的区别。
  • 另一个例子是char str[40] = "abc"; 检查sizeof strstrlen(str) 之间的区别。

标签: c pointers c-strings sizeof strlen


【解决方案1】:

变量token 的类型为char *,即它是一个指针

char * token = strtok(str, " ");

所以printf的这个电话

printf("%lu \n", sizeof(token));

输出系统中指针的大小。

例如,如果你使用一个不指向任何字符串的未初始化指针,你将得到相同的结果

char *token;
printf( "%zu \n", sizeof(token));

如果你想输出指向字符串的长度那么你需要写

printf("%zu \n", strlen(token));

【讨论】:

    【解决方案2】:

    sizeof 用于管理内存,而不是数据。它告诉你一个类型需要多少内存。 sizeof 数组是数组所需的字节数。 sizeof 指针是指针所需的字节数。

    strlen 用于管理字符串的数据。它告诉你一个字符串有多长,即第一个零字符之前的非零字符数。

    【讨论】:

      【解决方案3】:

      八位是指针的大小,取决于平台。您需要遍历token 变量或使用strlen(token) 来获取实际大小。

      【讨论】:

        猜你喜欢
        • 2017-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-22
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        • 2012-08-24
        相关资源
        最近更新 更多