int a = 0;//全局初始化区
char *p;//全局未初始化区
int main(int argc, char * argv[]) {
int b;//栈
char *p1;//栈
char s[] = "abc";//栈
char *p2 = "123456";//"123456"在常量区,p2在栈上
static int c = 0;//全局静态区,初始化区
p = (char *)malloc(10);//分配得来的10和20字节的区域在堆区
p1 = (char *)malloc(20);//分配得来的10和20字节的区域在堆区
strcpy(p1, "123456");//123456在常量区,编译器可能将它与p1所指向123456优化为一个地方
}
p1 = (char *)malloc(10);
p2 = (char *)malloc(10);
但是注意 p1、p2本身是在栈中的。
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
比如:
#include
void main(){
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}
对应的汇编代码
10: a = c[1];
00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh]
0040106A 88 4D FC mov byte ptr [ebp-4],
cl11: a = p[1];
0040106D 8B 55 EC mov edx,dword ptr [ebp-14h]00401070 8A 42 01 mov al,
byte ptr [edx+1]00401073 88 45 FC mov byte ptr [ebp-4],al
第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,再根据edx读取字符,显然慢了。