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

int main()
{ 
  char* charPtr="see me";
  printf("%s\n", charPtr);
  printf("%d", charPtr);
  return 0;
}

我不明白这一行: char* charPtr="see me";

内存是怎么分配的?

是否分配了 7 个字节的内存并将指针分配给第一个字节?和

我知道 sizeof(char*) 是 4bytes,它在这里有什么关系,它对内存分配有什么影响?

有人请帮助我。谢谢...

4

6 回答 6

6

charPtr是一个指向字符串字面量“see me”的指针,它位于实现定义的内存区域中的某处。不应修改此字符串文字,任何这样做的尝试都会给您留下未定义的行为

我知道sizeof(char*)4字节,它在这里有什么关系,它对内存分配有什么影响?

因为charPtr是一个指针,您不能使用它sizeof()来确定字符串文字的长度。如果你这样做,你得到的是指针而不是字符串占用的内存。strlen()如果需要获取字符串的长度,则需要使用。

         +-----+     +---+---+---+---+---+---+----
charPtr: |  *======> | s | e | e |   | m | e |\0 |
         +-----+     +---+---+---+---+---+---+---- 
于 2012-09-05T10:47:26.237 回答
3

字符串文字被放置在内存中的“某处”,以便在程序启动时可用。

分配变量charPtr(通常在堆栈上),并且通常在 32 位平台上使用 32 位,或在 64 位平台上使用 64 位。在您的情况下,由于您声明了sizeof (char *) is 4, the pointer will need4 * CHAR_BIT` 位,这在几乎所有具有字节可寻址内存的现代计算机上都是 32 位。

指针被初始化为指向字符串的第一个字节。

于 2012-09-05T10:47:01.167 回答
2

是否分配了 7 个字节的内存并将指针分配给第一个字节?

事实上,并非如此。在内存的只读部分的某处,分配了 7 个字符,包含"see me\0",并且该变量指向它。

不同的是,如果你写

char charPtr[]="see me";

在这种情况下,将在堆栈上分配 7char(+ 一些填充)长数组,其中将复制文本“see me”。

内存是怎么分配的?

它由操作系统在启动应用程序时分配。

于 2012-09-05T10:47:23.537 回答
2

"see me"是一个字符串文字,将在程序的整个生命周期中存在。没有在堆栈上分配内存,也没有在堆上为字符串文字分配内存。字符串文字将被编译成二进制文件,进入只读区域。

字符串文字中有 8 个字符"see me":您看到的 7 个字符加上一个隐式空终止符。

初始化:

char* charPtr="see me";

给出charPtr字符串文字的地址。修改字符串文字是未定义的行为。

有关更多详细信息,请参阅 C99 标准的第6.4.5 节字符串文字


注意:

printf("%d", charPtr);

是技术上未定义的行为,因为%d期望一个int参数,但charPtr它是一个char*: 使用%p

于 2012-09-05T10:48:17.533 回答
1

Normally the statement uses a const pointer.

const char* charPtr = "see me";

"see me" is allocated in read-only memory. charPtr contains the address of the 's'. The string is terminated by the null char.

于 2012-09-05T10:49:45.650 回答
0

char*就像指向 string 的第一个索引的普通指针一样。

于 2012-09-05T11:01:18.690 回答