2

我正在尝试以下代码。

           #include <stdio.h>


           int main() {
                   char *s2 = "Test";
                   char *s3 = "Test";


                   printf("\n%u",s2);
                   printf("\n%u",s3);

                   return 0;
           }

当我执行此代码时,我得到以下输出。

           4196492
           4196492

为什么输出是这样的。?它为 s2 和 s3 打印相同的地址

4

2 回答 2

4

在大多数编译器中,当将字符串值直接分配给指针时,它会存储在只读块中(通常在数据段中)。

这是在功能之间共享的。

当你说char *str = "Test";

“测试”存储在共享只读位置,但指针str存储在读写内存中,并str指向只读位置中的该内存位置。当您将相同的字符串分配给不同的指针时,例如char* str2 = "Test";. 指针将str2指向与只读存储器位置相同的地址,这就是输出相同的原因。

以下代码将失败;程序将崩溃,因为您试图更改只读字符串:

int main() {
    char *str; 
    str = "Test";     // Stored in read only part of data segment
    *(str+1) = 'n'; // Trying to modify read only memory. segfault
    getchar();
    return 0;
}

使用char数组创建字符串不同于使用char指针创建字符串;该char数组将像 C 中的其他类型的数组一样创建。

例如,如果str[]是自动变量,则字符串存储在堆栈段中。如果str[]是全局或静态变量,则存储在数据段中。

int main() {
    char str[] = "Test";  // Stored in stack segment like other auto variables
    *(str+1) = 'n';   //This is fine
    getchar();
    return 0;
}

以下代码澄清了一些事情:

#include <stdio.h>
char s1[] = "Test"; //Global in data segment

int main() {
    char *s2 = "Test"; //Read only 
    char *s3 = "Test"; //pointed to a string in a Read only memory 
    char s4[] = "Test"; //stack segment
    char s5[] = "Test"; //another array in stack segment

    printf("\n%p",s1); 
    printf("\n%p",s2);
    printf("\n%p",s3);
    printf("\n%p",s4);
    printf("\n%p",s5);

    return 0;
}

这将打印这样的东西。

6294408
4196492
4196492
1092092672
1092092656

所以你可以看到和的地址s1是不同的。s4s5

于 2013-10-19T04:46:56.590 回答
0

因为 aString自动作为引用类型存储在内存中,所以它本身被视为地址。如果将“TEST”存储为另一个指针,则该指针将指向先前存储“TEST”的相同地址。

于 2013-10-19T04:58:23.583 回答