簡體   English   中英

C中的字符串指針可以直接分配字符串文字嗎?

[英]Can a string pointer in C be directly assigned a string literal?

以下程序運行正常,我很驚訝為什么:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

void xyz(char **value)
{
        // *value = strdup("abc");
        *value = "abc"; // <-- ??????????
}

int main(void)
{
        char *s1;

        xyz(&s1);

        printf("s1 : %s \n", s1);
}

輸出:

s1 : abc

我的理解是我必須使用strdup()函數為C中的字符串分配內存,而我沒有分配內存。 但是在這種情況下,只需使用“”分配字符串值,程序似乎工作正常,任何人都可以解釋一下嗎?

以太字符串中不存在字符串文字。 它們駐留在程序存儲器中並具有地址。

因此,您可以將該地址分配給指針。 程序的行為定義得很好,只要你不嘗試通過指針修改文字,就不會發生任何不好的事情。

因此,最好通過const正確使編譯器為您工作。 希望盡可能將指針類型標記為const,並且編譯器將反對修改嘗試。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

void xyz(char const **value)
{
        *value = "abc";
}

int main(void)
{
        char const *s1;

        xyz(&s1);

        printf("s1 : %s \n", s1);
        s1[0] = 'a'; << Error on this line
}

您的程序工作正常,因為字符串文字"abc"是字符數組,並且在將字符串文字指定給指針時實際發生的是,編譯器首先創建一個字符數組,然后返回數組的第一個元素的地址,就像當我們稱之為任何其他數組的名稱。 所以在你的程序中,你已經將char指針的地址傳遞給函數xyz

*value = "abc";

對於這個語句,編譯器首先在內存中創建一個字符數組,然后返回它的地址,然后將其存儲在char指針中。值得知道編譯器在只讀內存中創建char數組。因此,返回的地址是到const char數組。任何嘗試修改其值都將返回編譯時錯誤。

您可以使用char *str = "some string";在C中定義char *str = "some string"; ,str是一個指向字符串中第一個字母位置的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM