使用指向char的指针时出现分段错误

Rnd*_*p13 0 c pointers char segmentation-fault

在编译和执行以下程序时,我在编译期间收到警告并在执行期间发生seg错误.

警告

program.c: In function main:
program.c:17: warning: passing argument 2 of convertString from incompatible pointer type
Run Code Online (Sandbox Code Playgroud)

第17行是打电话给 convertString(input, &output);

附加调试器可以看到在下面的行发生了段错误

Program received signal SIGSEGV, Segmentation fault.
0x0000000000400521 in convertString (input=0x7fffffffd100 "abcdefg", output=0x7fffffffd0f0) at program.c:9
9           **output = *input;
(gdb) s

#include<stdio.h>
#include<string.h>
void convertString(char *input, char **output)
{
    if(strlen(input)== 0)
    {
        return;
    }
    **output = *input;
    (*output)++;
    convertString(input+1,output);
}
int main()
{
    char input[] = "abcdefg";
    char output[sizeof(input)];
    convertString(input, &output);
    printf("%s", output);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

请帮助我在哪里做错了.

Som*_*ude 5

问题是它output不是一个指针,它是一个数组,并且在数组上使用address-of运算符会给你一个指向数组的(单个)指针(在你的类型的情况下char (*)[8]).为了澄清:(void *) output == (void *) &output数组的衰减指针和指向数组的指针都是相同的.

所以你并没有真正传递一个指向char函数指针的指针.


除了上面的内容,我认为该函数没有理由采用指针指针,普通的单指针应该足够了.否则output,在printf调用中使用时会得到错误的结果,因为它output会超出字符串的结尾.

此外,您不会终止output字符串.