[英]Understanding strings and arrays
考慮這段代碼。
int main()
{
char *s, *t;
s = malloc(4 * sizeof(char));
strcpy(s, "foo");
t = s;
printf("%s %s\n", s, t); // Output --> foo foo
strcpy(s, "bar"); // s = "bar"
printf("%s %s\n", s, t); // Output --> bar bar
}
有兩個字符串s
和t
。 首先我將s
設置為"foo"
,然后將t
指向s
。 當我打印字符串時,我得到了foo foo
。
然后,將"bar"
復制到s
並再次打印,我得到bar bar
。
在這種情況下,為什么t
值會發生變化? (我復制"bar"
,以s
為什么t
改變)。
現在,當我將strcpy(s, "bar")
更改為s = "bar"
-
int main()
{
char *s, *t;
s = malloc(4 * sizeof(char));
strcpy(s, "foo");
t = s;
printf("%s %s\n", s, t); // Output --> foo foo
s = "bar"
printf("%s %s\n", s, t); // Output --> bar foo
}
這段代碼給了我foo foo
和bar foo
。
在這種情況下為什么不改變?
這是未定義的行為 ,這意味着任何事情都可能發生:
char *s, *t;
strcpy(s, "foo");
因為strcpy()
正在寫入內存中的隨機位置,因為s
是未初始化的指針。
( 編輯后修正了未定義的行為 )
問題1 - 為什么在這種情況下t的值會發生變化? (我復制了“bar”為什么沒有改變)。
這是一個指針賦值:
t = s;
並導致t
和s
指向malloc()
並分配給s
的同一內存。 通過t
和s
可以看到對該內存的任何更改。
問題2 - 為什么在第二種情況下不改變?
這將字符串文字"bar"
的地址分配給s
:
s = "bar";
所以現在t
和s
沒有指向相同的內存位置。 t
指向早期malloc()
並分配給s
的內存(因為t = s;
指針賦值)。
strcpy()
和=
非常不同:
strcpy()
字符復制到其第一個參數指定的內存地址 =
,更改指針所包含的地址 strcpy(s, "foo");
將foo
復制到s
t = s指向的內存位置; 現在, t
和s
都指向相同的位置因此,相同的輸出
現在,您將bar
復制到s
。 由於t
和s
指向相同的位置。 因此,同樣的輸出。
到這一行,一切都是一樣的
s = "bar"
您創建一個字符串常量bar
。 並將其地址分配給s
。 它是一個可以指向任何內存位置的pointer
。 不一定是原來的。
現在,
s
點, bar
和t
仍然在較前位置它在開始時指出,因此輸出
一種簡單的理解方式如下: -
s = malloc(4 * sizeof(char)); // this will be interpreted as follows
s = 123 ------------>| | | | | //some garbage values at these location
123 124 125 126 // some random address chosen.
strcpy(s, "foo") ; // it copies at the address provided by s i.e.
|'f'|'o'|'o'|'\0'|
123 124 125 126
t = s; this statement means t it pointing to address = 123
strcpy(s, "bar"); // this statement copies at given address it means it will override previous value . i.e
|'b'|'a'|'r'|'\0'|
123 124 125 126
現在仍然指向地址123,這就是為什么t,s都打印條形碼。
s = "bar" // this will assign a new address to s which is base address of "bar" string . i.e .
|'b'|'a'|'r'|'\0'|
321 322 323 324
現在s將包含地址321而t具有值123,這就是s和t給出不同值的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.