【问题标题】:How to initialize char ** in C?如何在 C 中初始化 char **?
【发布时间】:2020-06-28 20:17:32
【问题描述】:

我对 C 很陌生。

我应该做一个简单的单词搜索拼图,所以对于“字典”我做了:

char **dictionary = {"DOG", "ELEPHANT", "CAT", "ETC", ""};

但是当我尝试编译时,我收到一条警告,指出字典中每个单词的“标量初始值设定项中的多余元素”。 char ** 是否初始化错误?我该怎么做?

编辑:我的函数接收 char **dictionary。

提前致谢。

【问题讨论】:

  • 使用char **dictionary 或char** dictionary,而不是char ** dictionary。
  • 它会正确警告您,因为它是指向 char 的指针而不是指向 char 指针数组的指针。
  • @RobertHarvey 为什么不呢?详细说明。
  • @P__J__:快速浏览一下 Internet 上的编码标准。其中绝大多数有两条规则;它们实际上是:1. 使用int *ptr,以及 2. 每行一个声明。只有一种情况在星号之后的和之前出现空格:const int * const p1 = &something;
  • @RobertHarvey ... 请 .... static inline void dump_skb (char * prefix, unsigned int vc, struct sk_buff * skb) { - 形成 Linux 源代码。个人喜好。我使用你的“格式”,但其他人更喜欢别的东西,我不反对

标签: c string pointers char


【解决方案1】:
const char *data[] = {"DOG", "ELEPHANT", "CAT", "ETC", ""};
const char **dictionary = data;

【讨论】:

  • 感谢您的回答。这样做会有用吗?如果我必须做第一行,那么我看不到写第二行的意义,因为静态数组已经完成。另外,我不能添加/删除单词,对吗?
  • 如果您打算迭代数据,那么能够做到for( dictionary = data; ...; dictionary++) 很有用
  • 为什么不只是char *dictionary[] = {"DOG", "ELEPHANT", "CAT", "ETC", ""}; ?
  • @Wyck 但是我不能添加/删除单词,对吗?我很困惑,不会撒谎
  • 可以,可以修改数组。指针数组的工作方式与任何其他数组一样。
【解决方案2】:
char **values = (char *[]){"a", "b", "c"};

或

const char *array[] = {
    "First entry",
    "Second entry",
    "Third entry",
};

【讨论】:

  • 感谢您的回答。我的疑问是,如果我使用 char * array[ ] 而不是 char **,我会不会浪费内存?另外,这是否意味着我不能以任何方式初始化 char **?
  • 你会怎么浪费内存?
  • 使用char *array[] 或char* array[],而不是char * array[]。
  • @IgorRivin 抱歉,我搞砸了。我的意思是,我不能添加或删除单词,对吗?
  • @RobertHarvey 这是个人喜好。 char*p; char *p; char* p; 和 char * p; 对于 C 编译器来说是一样的,因为它会忽略空格。
【解决方案3】:
const char **addresses = {"0xabcdefgh"};

只产生一个警告

Incompatible pointer types initializing 'const char **' with an expression of type 'char [11]'
[clang -Wincompatible-pointer-types]

访问addresses[0]时失败。

例子:


/*
clang t.c && ./a.out
gcc t.c && ./a.out
 */
#include <stdio.h>
void printaddress0(const char **addresses) {
    printf(addresses[0]);
}
int main() {
    //const char **addresses = {"0xabcdefgh"}; // segmentation fault
    const char *addresses[] = {"0xabcdefgh"};
    printaddress0(addresses);
}


【讨论】:

    猜你喜欢
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2020-10-04
    • 1970-01-01
    • 2013-09-12
    • 2023-03-17
    相关资源
    最近更新 更多