簡體   English   中英

理解字符串和數組

[英]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
}

有兩個字符串st 首先我將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 foobar foo

在這種情況下為什么不改變?

這是未定義的行為 ,這意味着任何事情都可能發生:

char *s, *t;
strcpy(s, "foo");

因為strcpy()正在寫入內存中的隨機位置,因為s是未初始化的指針。


編輯后修正了未定義的行為

問題1 - 為什么在這種情況下t的值會發生變化? (我復制了“bar”為什么沒有改變)。

這是一個指針賦值:

t = s;

並導致ts指向malloc()並分配給s的同一內存。 通過ts可以看到對該內存的任何更改。

問題2 - 為什么在第二種情況下不改變?

這將字符串文字"bar"的地址分配給s

s = "bar";

所以現在ts沒有指向相同的內存位置。 t指向早期malloc()並分配給s的內存(因為t = s;指針賦值)。

strcpy()= 非常不同:

  • strcpy()字符復制到其第一個參數指定的內存地址
  • assignment, = ,更改指針所包含的地址
strcpy(s, "foo");

foo復制到s t = s指向的內存位置; 現在, ts都指向相同的位置因此,相同的輸出

現在,您將bar復制到s 由於ts指向相同的位置。 因此,同樣的輸出。


到這一行,一切都是一樣的

s = "bar"

您創建一個字符串常量bar 並將其地址分配給s 它是一個可以指向任何內存位置的pointer 不一定是原來的。

現在,

s點, bart仍然在較前位置它在開始時指出,因此輸出

一種簡單的理解方式如下: -

      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.

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