0

可能重复:
C -> sizeof 字符串始终为 8

我找到了以下创建字符串的方法:

#include <stdio.h>
#include <string.h>

int main(void) {
    char *ptr = "this is a short string";
    int count = sizeof ptr / sizeof ptr[0];
    int count2 = strlen(ptr);
    printf("the size of array is %d\n", count);
    printf("the size of array is %d\n", count2);
    return 0;
}

我不能使用通常的方式来获取长度sizeof ptr / sizeof ptr[0],这种创建字符串的方式是否有效?他的符号有什么优点和缺点吗?

4

4 回答 4

2

当你这样做时

char *ptr = "this is a short string";

ptr 实际上是堆栈上的指针。它指向只读内存上的字符串文字。

[ptr] ---->  "This is a short string"

因此,尝试获取 sizeof ptr 将始终评估为特定机器上 int 的大小。

但是当你尝试这个

char ptr[]="this is a short string";

然后实际上对于整个字符串,内存是在堆栈上创建的,ptr具有数组的起始地址

|t|h|i|s| |i|s| | |a| |s|h|o|r|t| |s|t|r|i|n|g|\0|

|' '| ==> 这实际上是上图中显示的一个字节,而 ptr 保留了 |t| 的地址。

所以 size ofptr会给你整个数组的大小。

于 2012-10-22T08:11:10.430 回答
1

是的,使用 strlen 获取字符串的大小是有效的。更重要的strlen是,获取字符串大小的正确方法。这里的 sizeof 解决方案甚至是错误的。sizeof ptr8在 64 位系统上返回,因为它是指针的大小除以 char 的大小,也就是说,1您将仅获得8.

唯一可以sizeof用来获取字符串大小的情况是当它被声明为字符数组 ( char[]) 时。

于 2012-10-22T07:57:34.897 回答
1

因为ptr指针而不是数组。如果您使用char ptr[]而不是char *ptr,您将得到一个几乎正确的结果 - 而不是 22,它会导致 23,因为数组的大小NUL还包含终止字节,它不计入strlen().

顺便说一句,像这样“创建”一个字符串(几乎)是有效的,但是如果你不使用字符数组,编译器会用常量字符串数组的地址初始化指针,所以你真的应该写

`const char *ptr`

而不是你现在拥有的(即添加const限定符)。

于 2012-10-22T07:59:12.313 回答
0

如果您修改字符串,此代码将崩溃(因为最近的编译器将其视为常量)。此外,它会给出不正确的结果,因为 sizeof(ptr) 返回的是指针大小而不是字符串大小。

你应该写:

char ptr[] = "this is a short string";

因为此代码将让您找到字符串长度以及修改字符串内容。

于 2012-10-22T07:57:45.490 回答