C中的char指针

时间:2012-09-05 10:45:05

标签: c

#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字节,这里有什么关系,它对内存分配有什么影响?

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

6 个答案:

答案 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参数,但charPtrchar*:请改用%p

答案 4 :(得分:1)

通常语句使用const指针。

const char* charPtr = "see me";

“see me”分配在只读内存中。 charPtr包含's'的地址。该字符串由null char终止。

答案 5 :(得分:0)

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