【问题标题】:C char* array allocationC char* 数组分配
【发布时间】:2014-12-28 16:03:29
【问题描述】:

我正在编写一个函数来将命令行作为 char* 参数数组解析到另一个程序,但后来我遇到了分配和/或读取结果缓冲区的问题。我被困在这个问题上大约 2 天,后来 1000 多次 google 搜索,我自己无法弄清楚。

#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h> //for malloc, realloc 

char** parse_cmdline(const char* cmdline) {
    int wrdc = 0; //word count
    int wrd_len = 0; //current word length
    char** args = NULL; //result buffer, filled with arguments
    int i; //counter of characters read from cmdline 
    for(i = 0; ; ++i){  
        if(cmdline[i] == '\n') {
            if(wrd_len > 0) {
                ++wrdc;
                args = realloc(args, wrdc * sizeof(char*));
                memcpy((void*)&args[wrdc - 1], (void*) &cmdline[i - wrd_len], wrd_len);
                printf("EOL found\n");
                wrd_len = 0;
            }
            break;
        } 
        else if(cmdline[i] == ' ') {
            if(wrd_len > 0) {
                ++wrdc;
                args = realloc(args, wrdc * sizeof(char*));
                memcpy((void*)&args[wrdc - 1], (void*) &cmdline[i - wrd_len], wrd_len);
                printf("space found!\n");
                wrd_len = 0;    
            }
        }
        else if(cmdline[i] > 32 && cmdline[i] < 127) {
            ++wrd_len;
            printf("char found !\n");
        }
        //FOR DEBUGGING
        printf("i = %d, wrdc = %d, wrd_len = %d\n", i, wrdc, wrd_len);
    }
    printf("%d words in command\n", wrdc);
    return args;
}

int main(int argc, char* argv[]) {
    char buffer[200];
    while(read(STDIN_FILENO, buffer, 200) > 0) {
        char** data = parse_cmdline(buffer);
        printf("%s\n", data[0]);
        memset(buffer, 0, 200);
        free(data);
    }
    return 0;
}

【问题讨论】:

  • 不知道你在问什么。请仅显示相关代码并清楚说明什么不起作用。
  • 没有必要将void*的参数转换为memcpy()

标签: c arrays parsing memory-management


【解决方案1】:
   else if(cmdline[i] == ' ') {
        if(wrd_len > 0) {
            ++wrdc;
            args = realloc(args, wrdc * sizeof(char*));
            memcpy((void*)&args[wrdc - 1], (void*) &cmdline[i - wrd_len], wrd_len);
            printf("space found!\n");
            wrd_len = 0;    
        }
    }

这里存储在args[wrdc-1] 中的指针未初始化并指向未知位置。您不应该只是将memcpy()cmdline 转换为args[wrdc-1]

memcpy()之前的一个参数分配内存:

args[wrdc-1] = calloc(wrd_len+1, sizeof(char));

注意 +1calloc() 用于终止 NULL 字符。记得在main()释放他们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2018-03-20
    • 2011-02-07
    • 1970-01-01
    • 2014-07-17
    相关资源
    最近更新 更多