c - 我对 char** 有什么误解?

标签 c pointers char

我正在为计算机科学课做一些家庭作业,而一项相当繁琐的作业的最后一部分是编写一个可以反转句子的函数。教授提供的函数原型(prototype)是这样的:

int reverseSentence(char** sentence, char **
                newsentence, int maxWords)

...其中 sentence 是原始句子,newsentence 是我们应该转储反向句子的地方,而 maxWords 是原始句子中的单词数。我这样写我的函数...

int reverseSentence(char** sentence, char **
                newsentance, int maxWords)
{

    int i = maxWords;
    int x = 0;
    while(i > 0){
        newsentance[x] = sentence[i];
        x++;
        i--;
    }

    return maxWords;
}

然而,循环似乎永远持续下去。另外,我似乎对如何使用 char** 有误解。我以为它只是一个字符串数组,如 char[words][characters]。但是我收到有关以该形式将一组单词传递给函数的警告。我并不是要任何人为我做功课,只是为了弄清我在如何使用 char** 方面所遗漏的内容。

感谢任何帮助。谢谢。

P.S - 这是我尝试测试我的代码的方式:

char sentence[3][4] = {"Hi\n", "my\n", "fri\n"};
char newsentence[3][4];
reverseSentence(sentence, newsentence, 3);

最佳答案

如评论中所述,代码

char sentence[3][4] = {"Hi\n", "my\n", "fri\n"};

有效但与 char ** 不兼容。相反,它应该是:

char *sentence[3] = {"Hi\n", "my\n", "fri\n"};

第一个在内存中是这样布局的,字符打包成一个 block ,三组,每组四个字符:

+---+---+---+---+---+---+---+---+---+---+---+---+
| H | i | \n| \0| m | y | \n| \0| f | r | i | \n|
+---+---+---+---+---+---+---+---+---+---+---+---+

请注意,最后一个条目没有尾随 NUL (\0),因为数组中可用的 4 个字符没有空间。

第二个声明(你想要的)是一个包含三个指向以 NUL 结尾的字符串的指针的数组:

+---------------+---------------+---------------+
|    char *     |    char *     |    char *     |
+---------------+---------------+---------------+
       |               |               |
       |               |               |    +---+---+---+---+---+
       |               |               +--> | f | r | i | \n| \0|
       |               |                    +---+---+---+---+---+
       |               |    +---+---+---+---+
       |               +--> | m | y | \n| \0|
       |                    +---+---+---+---+
       |    +---+---+---+---+
       +--> | H | i | \n| \0|
            +---+---+---+---+

关于c - 我对 char** 有什么误解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12849777/

相关文章:

将 Char 缓冲区转换为短裤数组

c - 无论如何,是否可以使用odium.h 生成字符空间(32) 到~(126) ?或者其他生成安全字符串的方法?

c++ - 了解从二进制文件中提取频率以创建哈夫曼树的逻辑

c++ - 如何获取给定 HWND 的工具提示文本?

c - 通过字符串引用传递

复制 Char * 数组会损坏数据

c - 即使使用 -m32,32 位 shellcode 在汇编中执行,但在 64 位操作系统上不能在 c 中执行

c++ - 包含派生对象的 QPointer 不会与基类匹配

c - 释放分配给 char* (由 `malloc` 分配)的 int* 是否会调用未定义的行为?

java - 查找字符串中某个重复字符/子字符串的每个位置