2016-02-12 90 views
-1

我正在嘗試一些東西,發現這個小奇怪。使用下面的一段代碼,它將輸出「世界」(每個字符分解成每行)。這是否意味着傳遞給函數的參數在內存中是連續的?連續內存傳遞參數

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

void mystrtst(char *s, char *t); 

int main() { 
    mystrtst("Hello", "World"); 
} 

void mystrtst(char *s, char *t) { 
    while(*s++); 
    for(; *t ; s++, t++) { 
    printf("%c\n", *s); 
    }; 
} 
+0

也許這篇文章可以幫助你[參數變量存儲在內存?](http://stackoverflow.com/questions/16304705/where-are-parameter-variables-stored-in-memory)。 – Frodo

+0

在字符串文字中,字符是連續存儲的。 –

+0

字符串不傳遞給函數,它們的地址是。由於它們是字符串文字,它們可能駐留在內存中的只讀部分。在該部分中它們是否連續不是由c-標準規定的,即你正在調用未定義的行爲。 – EOF

回答

0

你有指向2個字符串存儲的是內存的一部分。

你看到的是未定義的行爲。

這並不能保證這2個字符串總是以您輸出顯示的方式進行存儲。

0

正如@戈皮所說,這是一個未定義的行爲。 要理解它運行這段代碼

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

void mystrtst(char *s, char *t); 

int main() { 
    char s1[]="Hello"; 
    char t1[]="World"; 
    mystrtst(s1, t1); 
} 

void mystrtst(char *s, char *t) { 
    while(*s++); 
    for(; *t ; s++, t++) { 
    printf("%c\n", *s); 
    }; 
} 

你會得到一些隨機字符顯示的參數的記憶是不連續的。實際上你只是通過地址。

當你直接傳遞參數爲"Hello", "World"它被存儲在只讀存儲器中,指向這些存儲器地址的指針被傳遞,不知何故,內存在你的情況下變得連續。不要指望每次都有相同的行爲。它是未定義的。