簡體   English   中英

為什么C指針在這里不起作用?

[英]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); 

  • 在C語言中, malloc是不必要的,通常被認為是可疑的做法
  • ni變量名有些令人誤解:人們期望它們相反
  • 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.

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