gpt4 book ai didi

c - 使用 C 中的指针表示法迭代双指针

转载 作者:行者123 更新时间:2023-11-30 21:47:51 26 4
gpt4 key购买 nike

如果我有一个指向像本示例中的变量“bs”这样的指针的指针:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
char **bs = {"this", "is", "a", "test"};

puts(bs);

return 0;
}

puts 语句在屏幕上显示“this”。我将如何让它显示"is"等等。我想我可以做这样的事情:

puts(bs+1);

向指针变量添加数字实际上有什么作用?它指向下一个地址,还是考虑指针的类型并使用它指向的变量的大小来确定下一个变量在内存中的起始位置?

最佳答案

the puts statement shows 'this' on the screen.

这只是(坏)运气,如果编译器根本不拒绝编译,代码会调用未定义的行为。

clang(默认情况下)为代码生成的警告是

$ clang badpoint.c 
badpoint.c:6:18: warning: incompatible pointer types initializing 'char **' with an
expression of type 'char [5]' [-Wincompatible-pointer-types]
char **bs = {"this", "is", "a", "test"};
^~~~~~
badpoint.c:6:26: warning: excess elements in scalar initializer
char **bs = {"this", "is", "a", "test"};
^~~~
badpoint.c:8:10: warning: incompatible pointer types passing 'char **' to parameter of
type 'const char *'dereference with * [-Wincompatible-pointer-types]
puts(bs);
^~
*
/usr/include/stdio.h:688:32: note: passing argument to parameter '__s' here
extern int puts (__const char *__s);
^
3 warnings generated.

gcc 会为每个多余的初始化器生成一个警告,而 clang 只会为三个中的第一个给出一个警告,否则来自 gcc 的警告(也是默认情况下)的信息量会少一些,但相同。

所以这是怎么回事?

您正在尝试初始化标量 (char**),并提供 {"this", "is", "a", "test"},一个大括号括起来的初始化列表,包含四个_initializer_‍。每6.7.9 (11)

The initializer for a scalar shall be a single expression, optionally enclosed in braces. The initial value of the object is that of the expression (after conversion); the same type constraints and conversions as for simple assignment apply, taking the type of the scalar to be the unqualified version of its declared type.

这违反了“应”的要求,因此会调用未定义的行为。

如果编译器没有在那里终止翻译,它可能只是忽略多余的初始化程序 - clang 和 gcc 都会这样做 - 并将声明视为就好像它是一样的

char **bs = "this";

这会导致有关来自不兼容类型的初始化的警告,因为它尝试使用 char[5] 初始化 char**,但根据 6.5.16.1初始化程序的类型必须与 char** 兼容。

尽管如此,如果编译器成功翻译了程序,很可能会生成包含字符串文字中第一个 char 的地址的 bs(数组 >“this” 被转换为指向赋值运算符右侧第一个元素的指针。

然后调用

puts(bs)

将错误类型的指针 (char**) 传递给 puts,这是一种约束冲突,需要来自编译器的诊断消息(并使程序无效)。

但是指针恰好包含正确的地址,并且未定义的行为表现为程序打印“this”

How would I go about getting it to show 'is' and so forth

通过更正程序。事实上,字符串 "is""a""test" 甚至不会出现在 gcc 或生成的目标文件中 clang 。

纠正它的一种方法是将声明更改为

char *bs[] = {"this", "is", "a", "test"};

因此,bs 是一个由四个 char* 组成的数组,指向四个字符串(各自的第一个元素)。

然后您必须调整对 puts 的调用,取消引用或下标 bs

puts(bs[0]);

打印“this”

for(int i = 0; i < 4; ++i) {
puts(bs[i]);
}

将所有四个字符串打印在单独的行上。

关于c - 使用 C 中的指针表示法迭代双指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15897284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com