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程序:使用双指针更改函数中的字符串的主要内容,如果未能解决你的问题,请参考以下文章