c程序为字符串打印相同的地址,c程序的意外输出

时间:2013-10-19 04:46:36

标签: c

我正在尝试使用代码。

           #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打印相同的地址

2 个答案:

答案 0 :(得分:4)

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

这是在功能之间共享的。

当你说char *str = "Test";

“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

因此,您可以看到s1s4s5的地址不同。

答案 1 :(得分:0)

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