[英]Why it c pointer doesn't work here?
我是C語言的初學者,我不太了解的是malloc的使用。 因此,我決定創建此示例。 我想了解為什么它不打印出緩沖區數據,以及這樣做的最佳實踐是什么。
#include <stdio.h> /* printf, scanf, NULL */
#include <stdlib.h> /* malloc, free, rand */
void f(char * buffer, int i) {
buffer = (char *) malloc(i+1);
if (buffer==NULL)
exit (1);
for (int n=0; n<i; n++)
buffer[n]=rand()%26+'a';
buffer[i]='\0';
}
int main ()
{
char * buffer;
f(buffer, 5);
printf ("Random string: %s\n",buffer);
free (buffer);
return 0;
}
謝謝
您的buffer = (char *) malloc(i+1);
在功能外無效。 實際上,該函數正在更改其自己的buffer
副本,而調用方( main
)從未看到此更改。 在C FAQ中對此進行了很好的解釋。
您可以返回緩沖區,而不是將其作為參數傳遞,因為該函數目前不返回任何內容:
char *f(int i)
/* ... */
return buffer;
/* ... */
char * buffer = f(5);
malloc
是不必要的,通常被認為是可疑的做法 n
和i
變量名有些令人誤解:人們期望它們相反 f
不是函數的別名 為了修改傳遞給函數的指針,您必須使用指向指針的指針:
void f(char** buffer, int i) {
*buffer = malloc(i+1);
if (*buffer==NULL)
exit (1);
for (int n=0; n<i; n++)
(*buffer)[n]=rand()%26+'a';
(*buffer)[i]='\0';
}
用法:
char* buff;
f(&buff, len);
變量按值傳遞給函數。
當您調用f(buffer, 5)
,它不會將變量buffer
傳遞給函數f
; 它僅復制變量buffer
的值。 在函數f
,創建一個名為buffer
的新變量(參數變量)。 當您更改該變量的值時,從main
傳入的原始變量不受影響。
解決此問題的不同方法:
使f
返回指針,並將其保存在main
buffer
中:
char * f(int i) {
char * buffer = malloc(i + 1);
/* ... */
return buffer;
}
int main() {
char * buffer = f(5);
/* ... */
return 0;
}
或者將指針傳遞給f
的指針; 在main
,傳遞buffer
的地址:
void f(char ** buffer, int i) {
*buffer = malloc(i + 1);
/* ... */
}
int main() {
char * buffer;
f(&buffer, 5);
/* ... */
return 0;
}
您不能更改通過值傳遞的變量的原始值 。
如果要在函數中使用malloc,並在變量中返回malloc的結果,則必須按引用傳遞該變量。
例如:
void f(char * buffer, int i);
它應該是:
void f(char **buffer, int i);
CNICUTAR是正確的,但是這里有一些有趣的信息:
馬洛克:
不要強制轉換malloc(這是一個有趣的話題: 是否強制轉換malloc的結果? )。
對於循環:
對於for循環,您應該使用這種方式(C89版本):
int i;
for (i = 0; ...)
問候,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.