C - 指向函数的麻烦

时间:2016-02-19 02:28:09

标签: c function-pointers

我和我的伙伴正在研究这个涉及功能指针的问题。目标是编写一个函数,将一些字符串处理函数应用于字符串。然后,该函数返回一个字符串数组,其中包含输入字符串上每个处理函数的结果。任何帮助,将不胜感激。谢谢!

char** string_central(char*(**)(char*), char* str);
char* char_double(char* str);
char* char_shift(char* str);
char* char_flip(char* str);

void main(int argc, char* argv[]) {
    char* (*functions[])(char *) = {char_double, char_shift, char_flip, NULL};
    char** result = string_central(functions, *argv);
    char* result_ptr = *result;
    while( result_ptr ){
        printf("Result: %s", result_ptr);
        result_ptr++;
    }

}
char** string_central(char*(*functions[])(char*), char* str){
    char** returnArray = (char **) malloc(100*sizeof(char));
    char** firstposition = returnArray;
    while(*functions != NULL) {
        *(returnArray)++ = (*(functions))(str);
    }
    *(returnArray)++ = "\0";
    return firstposition;
}

//Other Functions work properly

2 个答案:

答案 0 :(得分:0)

你需要在string_central中使用malloc,如this => (100 * sizeof(char *))。字符的大小通常为1个字节,任何指针的大小通常为4个字节。 (这个)

哦,记得在使用后的某个时候释放内存。

答案 1 :(得分:0)

最明显的是,你的string_central函数在无限循环中重复调用传递函数数组中的第一个函数,运行returnArray分配结束并破坏内存。您需要在循环中递增functions指针。

你在char中为100 returnArray分配空间,而不是100个指针,你永远不会检查溢出(这个数组或任何分配的字符串),所以如果你的输入字符串太长,你就会溢出。

用空字符串标记returnArray的结尾(而不是NULL指针,这可能更有意义)。

您的char_XXX函数没有NUL终止它们创建的字符串。

回到main,当你尝试打印结果时,你只打印returnArray中的第一个字符串,然后沿着该字符串递增指针,打印相同字符串的部分,删除一个字符串时间。

最后,你永远不会释放你分配的任何内存。