C程序:使用双指针更改函数中的字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C程序:使用双指针更改函数中的字符串相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
#include<string.h>

void fun(char** a)

    strcpy(*a, "ponky" );


int main()

    char a[100] = "pinky";
    fun(&a );
    printf("\n %s \n", a );
    return 0;

通过双指针复制函数中的字符串。为什么上面的程序给出分割错误?

答案

注意:我怀疑这个问题是重复的,我发现了很多类似的问题,但是我没有找到确切的重复。因此,我发布了答案。如果有人找到完全相同的副本,我将删除此答案。

为什么上面的程序给分割错误?

简短的答案是,调用fun时类型不匹配。您不会像预期的那样给fun一个“指向char的指针”。因此,它失败了很多时间。

但是您接下来要传递给fun吗? 您应该如何发现出问题了?

答案是:将编译器警告级别设置为高并且将所有警告视为错误

对于gcc可能是:

gcc -xc -Wall -pedantic -Werror main.c

((其他编译器具有类似的选项)

在我的系统上,我得到:

In function 'main':
error: passing argument 1 of 'fun' from incompatible pointer type [-Werror=incompatible-pointer-types]
   13 | fun(&a );
      |     ^~
      |     |
      |     char (*)[100]
note: expected 'char **' but argument is of type 'char (*)[100]'
    3 | void fun(char** a)
      |          ~~~~~~~^

所以很明显,出了点问题,下面的代码说明了一切:

note: expected 'char **' but argument is of type 'char (*)[100]'

您通过char (*)[100]而不是char **

但是char (*)[100]是什么?

这是“指向char数组的指针”。由于fun将其用作“指向char的指针”,因此您具有未定义的行为(在您的情况下,这会导致seg错误)。也就是说-fun希望*a是“指向char的指针”,但是您传递了“指向char数组的指针”,因此*a不是“指向char的指针”。

这是未定义的行为,因此我们无法确定发生了什么。但是,在许多系统上,它将读取字符串“ pinky”,并将其解释为指向char的指针,这将导致长时间失败。

以上是关于C程序:使用双指针更改函数中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-双指针遍历

C和指针

C字符串常量定义

02char字符与字符串替换,双指针,从后往前

对函数调用中的单指针和双指针参数感到困惑

C字符串