[英]strange behavior in C function, string is not carried over
我有這樣的功能:
int foo(void *val){
(char *)val="Long String";
return 0;
}
該函數的調用方式如下:
char str[25];
foo(str);
printf("%s",str);
由於某種原因,我什么也沒打印出來。 這是怎么了
您實際上並沒有像您認為的那樣復制數據。 您要做的就是更改參數值以指向另一個內存地址。 參數是通過值傳遞的,因此對它的任何更改都不會反映在調用代碼中。 對於您要嘗試的操作,您需要使用strcpy()
或strncpy()
代替,例如:
int foo(char *val)
{
strcpy(val, "Long String");
return 0;
}
要么:
int foo(char *val, int maxlen)
{
strncpy(val, "Long String", maxlen);
return 0;
}
您將指向"Long String"
的指針存儲到在堆棧中分配的變量val
中。 變量的生存期僅在調用foo()
時才延長。
您不想將地址存儲到堆棧中的"Long String"
。 您想將字符串復制到提供的地址下。
您應該這樣做:
int foo(void *val){
strcpy((char*)val, "Long String");
return 0;
}
不過,這並不安全。 您應該將緩沖區的最大大小傳遞給foo
並使用strncpy()
而不是strcpy()
。
您沒有將任何內容復制到str
。 您只是在編輯傳入的指針值...
調用foo(str)
會創建一個名為void* val
的新臨時變量,並將其指向char[0]
。 然后,您將val
更改為指向字符串“ Long String”的開頭。
如果您實際上想填充char str[25]
緩沖區,請使用strncpy:
int foo (char* buf)
{ return strncpy (buf, "Long String", 25); }
但是,如果你發送這個例程char[]
在它不到25個位置,你將有重大問題。
我還想針對剛剛出現的一些建議,建議不要將strcpy
用於新代碼中,並且絕對不要提倡學習如何使用指針和字符數組的人。 那就是痛苦。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.