[英]Can a string be assigned to a char pointer, without it becoming a literal?
[英]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.