簡體   English   中英

C函數中的異常行為,字符串未結轉

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

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