#include<string.h>
#include<stdio.h>
int main()
{
char* charPtr="see me";
printf("%s\n", charPtr);
printf("%d", charPtr);
return 0;
}
我不明白这句话: char * charPtr =“见我”;
如何分配内存?
是否分配了7个字节的内存,并将指针分配给第一个字节?和
我知道sizeof(char *)是4字节,这里有什么关系,它对内存分配有什么影响?
有人请帮助我。谢谢...
答案 0 :(得分:6)
charPtr
是 字符串文字的“指针 ”“看到我” 位于某处在实现定义的内存区域。此字符串文字不应进行修改,任何尝试都会为您留下未定义的行为。
我知道
sizeof(char*)
是4
个字节,这里有什么关系,它对内存分配有什么影响?
由于charPtr
是指针,因此您无法使用sizeof()
来确定字符串文字的长度。如果你这样做,你得到的是指针占用的内存而不是字符串。如果需要获取字符串的长度,则需要使用strlen()
。
+-----+ +---+---+---+---+---+---+----
charPtr: | *======> | s | e | e | | m | e |\0 |
+-----+ +---+---+---+---+---+---+----
答案 1 :(得分:3)
字符串文字放在内存中“某处”,以便在程序启动时可用。
变量charPtr
被分配(通常在堆栈上),通常在32位平台上使用32位,或在64位平台上使用64位。在您的情况下,因为您声明sizeof (char *) is 4, the pointer will need
4 * CHAR_BIT`位,几乎所有具有字节可寻址内存的现代计算机上都是32位。
指针初始化为指向字符串的第一个字节。
答案 2 :(得分:2)
分配了7个字节的内存,并将指针分配给 第一个字节?
事实上,并非如此。在 readonly 部分内存中的某处,分配了7个字符,包含"see me\0"
,此变量指向它。
如果你写的话会有区别
char charPtr[]="see me";
在这种情况下,堆栈上的将被分配7char(+ some padding)长数组,其中将复制文本“see me”。
如何分配内存?
启动应用程序时由OS分配。
答案 3 :(得分:2)
"see me"
是一个字符串文字,将在程序的生命周期内存在。内存未在堆栈上分配,并且未在堆上为字符串文字分配内存。字符串文字将被编译成二进制文件,进入只读区域。
字符串文字"see me"
中有8个字符:您看到的7个字符加上隐式空终止符。
初始化:
char* charPtr="see me";
给charPtr
字符串文字的地址。修改字符串文字是未定义的行为。
有关更多详细信息,请参阅C99标准的 6.4.5字符串文字部分。
请注意:
printf("%d", charPtr);
在技术上是未定义的行为,因为%d
需要int
参数,但charPtr
是char*
:请改用%p
。
答案 4 :(得分:1)
通常语句使用const指针。
const char* charPtr = "see me";
“see me”分配在只读内存中。 charPtr
包含's'的地址。该字符串由null char终止。
答案 5 :(得分:0)
char*
就像普通指针指向字符串的第一个索引一样。