c将指针传递给函数以处理char数组和数据

时间:2016-01-02 21:25:02

标签: c arrays pointers memory-management

我正在编写一些处理字符串的函数,并发现我不能只将指针传递给函数和malloc,因为它不起作用。

例如:

char* string;
void create_string(char* output, char* text) {
   len = strlen(text);
   output = (char*)calloc(1, len);
   strncpy(output, "test", len);
}

这有点令人费解,但无论如何都无法奏效。我需要传入指向这样一个指针的指针:

char* string;
void create_string(char** output, char* text) {
   len = strlen(text);
   *output = (char*)calloc(1, len);
   strncpy(*output, "test", len);
}

并使用指针取消引用该地址。好的,没关系。

接下来我想做一些类似于读取文件的函数。这个功能很好用。

char* ru_read_file(char* data, const char* file_path) {
    FILE* fp;
    size_t buffer = 4096;
    size_t index = 0;
    int ch;

    fp = fopen(file_path, "r");
    if (fp == NULL) {
        printf("failed to open file: %s\n", file_path);
        return "-1\0";
    }
    printf("filepath: %s\n",file_path);

    data = (char*)malloc(sizeof(char) * buffer);
    while (EOF != (ch = fgetc(fp))) {
        data[index] = (char)ch;
        ++index;
        if (index == buffer - 1) {
            buffer = buffer * 2;
            data = realloc(data, buffer);
            if (data != NULL) {
                printf(
                    "buffer not large enough, reallocating %zu bytes to "
                    "load %s\n",
                    buffer, file_path);
            } else {
                printf("failed to realloc %zu bytes to load %s\n", buffer,
                       file_path);
            }
        }
    }
    data = realloc(data, (sizeof(char) * (index + 1)));
    data[index] = '\0';

    fclose(fp);
    return data;
}

上述功能可以正常工作并实现我的期望。接下来尝试传入一个指向指针的指针作为函数的第一个参数,我无法绕过它让它工作。

我虽然经历并从一个简单的指针更新变量通过指针取消引用它会起作用,但我得到seg错误。

这是代码

char* ru_read_file(char** data, const char* file_path) {
    FILE* fp;
    size_t buffer = 4096;
    size_t index = 0;
    int ch;

    fp = fopen(file_path, "r");
    if (fp == NULL) {
        printf("failed to open file: %s\n", file_path);
        return "-1\0";
    }
    printf("filepath: %s\n",file_path);

    data = (char**)malloc(sizeof(char) * buffer);
    while (EOF != (ch = fgetc(fp))) {
        *data[index] = (char)ch;
        ++index;
        if (index == buffer - 1) {
            buffer = buffer * 2;
            *data = realloc(data, buffer);
            if (*data != NULL) {
                printf(
                    "buffer not large enough, reallocating %zu bytes to "
                    "load %s\n",
                    buffer, file_path);
            } else {
                printf("failed to realloc %zu bytes to load %s\n", buffer,
                       file_path);
            }
        }
    }
    *data = realloc(*data, (sizeof(char) * (index + 1)));
    *data[index] = '\0';

    fclose(fp);
    return *data;
}

如何将指针传递给指针并像工作示例一样使用它?我宁愿避免读取数据,然后将其复制到另一个缓冲区。

2 个答案:

答案 0 :(得分:2)

您必须在第二个小例子中调用malloc,不要投射malloc和朋友的结果。并始终检查malloc的结果。因此,改变这一行:

data = (char**)malloc(sizeof(char) * buffer);

*data = malloc(sizeof(char) * buffer). 
if(*data == NULL) { // error handling
}

此外,在索引之前必须解除data,因为后一个运算符具有更高的优先级。也就是说,替换

*data[index] = (char)ch;

(*data)[index] = (char) ch;

同样适用于最终,必须是:

(*data)[index] = '\0';

最后,你根本不需要这个双指针,因为你可以将分配的内存作为char *返回。也就是说,回到您的工作示例,定义参数的局部变量char *data 而不是,最后定义return data;

答案 1 :(得分:0)

更改行

data = (char**)malloc(sizeof(char) * buffer);

*data = (char*)malloc(sizeof(char) * buffer);

尝试获得关于指针如何工作的更多理论知识。