2016-11-10 85 views
1

我有这个代码示例,并且大致了解它的逻辑,但是我陷入了一些细节。C中的malloc - 返回值

#define LSH_RL_BUFSIZE 1024 
char *lsh_read_line(void) { 
    int bufsize = LSH_RL_BUFSIZE; 
    int position = 0; 
    char *buffer = malloc(sizeof(char) * bufsize); 
    int c; 

    if (!buffer) { 
    fprintf(stderr, "lsh: allocation error\n"); 
    exit(EXIT_FAILURE); 
    } 

    while (1) { 
    // Read a character 
    c = getchar(); 

    // If we hit EOF, replace it with a null character and return. 
    if (c == EOF || c == '\n') { 
     buffer[position] = '\0'; 
     return buffer; 
    } else { 
     buffer[position] = c; 
    } 
    position++; 

    // If we have exceeded the buffer, reallocate. 
    if (position >= bufsize) { 
     bufsize += LSH_RL_BUFSIZE; 
     buffer = realloc(buffer, bufsize); 
     if (!buffer) { 
     fprintf(stderr, "lsh: allocation error\n"); 
     exit(EXIT_FAILURE); 
     } 
    } 
    } 
} 

我不明白两件事:首先,这条线究竟干什么?

char *buffer = malloc(sizeof(char) * bufsize) 

其次,以下线路如何工作?它是如何返回指针的?

return buffer; 
+0

“我们怎样才能返回一个指针?”只要用你可以返回一个整数的方式。你有什么理由认为你不能这样做? – MikeCAT

+0

['malloc'](https://linux.die.net/man/3/malloc)向操作系统请求由其参数指定的内存块(在本例中为'bufsize')。你返回一个指针,就像你从函数中得到的任何其他值一样,其细节取决于[ABI](https://en.wikipedia.org/wiki/Application_binary_interface) – yano

+0

我的意思是,它给了我们什么样的实用性在这个例子中? – AdamSMith

回答

3

这条线究竟干什么?

malloc指“存储器分配” malloc函数用于动态创建的存储块,它分配以字节指定大小的存储块(作为一个参数)。它返回一个指向该块开始的指针。

因此,这里指定的尺寸是'sizeof(char) * bufsize',即正在请求长度为'bufsize'的字符块。要获得1个字符的大小,请使用运算符sizeof(sizeof是运算符而非函数)

以下行如何工作?

功能lsh_read_line返回指针到一个存储器块,这是由这里malloc分配的存储器 - 它是buffer

它是如何返回指针的?

由于它是堆中的动态内存 - 即使在函数返回后它仍然是有效的内存块。

作为一个附注 - 'lsh_read_line'来电者必须释放此buffer,否则有内存泄漏!

有关下进一步细节函数栈请参考https://en.wikipedia.org/wiki/Call_stack