Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将char[n][length+1]强制转换为C中字符串的常量数组?_C_Arrays - Fatal编程技术网

如何将char[n][length+1]强制转换为C中字符串的常量数组?

如何将char[n][length+1]强制转换为C中字符串的常量数组?,c,arrays,C,Arrays,我有一个由10个字符串组成的数组,长度最多为20,我正在构建这个数组 char buffer[10][20] = {0}; //populate the buffer with 10 strings //after this point, no more changes to the buffer allowed //make a new pointer to indicate that I want the buffer finalized const char **finalized = b

我有一个由10个字符串组成的数组,长度最多为20,我正在构建这个数组

char buffer[10][20] = {0};
//populate the buffer with 10 strings
//after this point, no more changes to the buffer allowed
//make a new pointer to indicate that I want the buffer finalized
const char **finalized = buffer;
但是前面的警告失败了

 warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
用一个字符串做类似的事情也很有效

char buffer[20] = {0};
//populate the buffer
const char *finalized = buffer;

在第一种情况下,强制转换的正确方法是什么?

不可能将常规2D数组强制转换为指针类型的指针。这些类型完全不兼容,并且具有完全不同的语义。你可以强制施法,但结果将毫无用处

在形式上,本例中正确的指针类型是char*[20]

除了C语言的常量正确性规则不允许在这里添加常量之外。但是你可以强迫它

const char (*finalized)[20] = (const char (*)[20]) buffer;
你也可以

char (*finalized)[10][20] = &buffer;

这对您是否有用?我不知道,因为您没有提供有关其用途的任何详细信息。

不可能将常规2D数组强制转换为指针类型的指针。这些类型完全不兼容,并且具有完全不同的语义。你可以强制施法,但结果将毫无用处

在形式上,本例中正确的指针类型是char*[20]

除了C语言的常量正确性规则不允许在这里添加常量之外。但是你可以强迫它

const char (*finalized)[20] = (const char (*)[20]) buffer;
你也可以

char (*finalized)[10][20] = &buffer;

这对您是否有用?我不知道,因为您没有提供有关其用途的任何详细信息。

如果您有一个2D数组,您不能简单地将其转换为指针对指针。指针和数组不一样

如果您希望字符串的长度大于19,那么在本例中需要使用char*[20]使字符串的数量灵活,正如@AnT所指出的那样

注意:使用20作为维度意味着您最多可以有19个字符,因为一个空格必须占用空终止字符\0

以下是一个例子:

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

#define STRLEN 20
#define NUMSTR 10

int main(void) {
    char buffer[NUMSTR][STRLEN];

    strcpy(buffer[0], "Hello");
    strcpy(buffer[1], "World");

    char (*finalized)[STRLEN] = buffer;

    printf("%s %s!\n", finalized[0], finalized[1]);

    return 0;
}

如果您有一个2D数组,则不能简单地将其转换为指针对指针。指针和数组不一样

如果您希望字符串的长度大于19,那么在本例中需要使用char*[20]使字符串的数量灵活,正如@AnT所指出的那样

注意:使用20作为维度意味着您最多可以有19个字符,因为一个空格必须占用空终止字符\0

以下是一个例子:

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

#define STRLEN 20
#define NUMSTR 10

int main(void) {
    char buffer[NUMSTR][STRLEN];

    strcpy(buffer[0], "Hello");
    strcpy(buffer[1], "World");

    char (*finalized)[STRLEN] = buffer;

    printf("%s %s!\n", finalized[0], finalized[1]);

    return 0;
}

{0}是一维数组的初始值设定项。@Eugene Sh:否。此外,它是荒谬的。在C语言中,{0}是一个惯用的通用零初始值设定项。它可以用于零初始化任何内容。是的,但不是没有抱怨,例如警告:初始化器周围缺少大括号[-Wmissing brates]。作为的一部分启用-Wall@DavidC.兰金:那么,不要启用它。我记得几年前,GCC默认启用了它,并因为用一个愚蠢的警告破坏了像{0}这样有用和精髓的东西而受到抨击。现在它不再默认启用。但事实上,他们在墙模式下没有给予{0}特殊处理,这表明有人仍然不知道他们在那里做什么。我不是在反驳警告。我一直只配牙套——很高兴知道这是危险的。在C工具箱中添加了惯用的通用零初始值设定项:{0}是一维数组的初始值设定项。@Eugene Sh:否。此外,它是荒谬的。在C语言中,{0}是一个惯用的通用零初始值设定项。它可以用于零初始化任何内容。是的,但不是没有抱怨,例如警告:初始化器周围缺少大括号[-Wmissing brates]。作为的一部分启用-Wall@DavidC.兰金:那么,不要启用它。我记得几年前,GCC默认启用了它,并因为用一个愚蠢的警告破坏了像{0}这样有用和精髓的东西而受到抨击。现在它不再默认启用。但事实上,他们在墙模式下没有给予{0}特殊处理,这表明有人仍然不知道他们在那里做什么。我不是在反驳警告。我一直只配牙套——很高兴知道这是危险的。在C工具箱中添加了惯用的通用零初始值设定项:我想将最终确定的数组传递给execv。在man 3 exec中,我看到execv需要一个char*const argv[],这有帮助吗?必须有某种方法进行强制转换,否则如何使用带有可变参数的exec?@nullUser:强制转换在这里对您没有帮助。您必须单独构建该argv。argv是指针数组。您的缓冲区是一个数组数组,这是完全不同的事情。请参见此处:了解更多详细信息。@nullUser您应该在问题中提及您的要求。我想将最终确定的数组传递给execv。在man 3 exec中,我看到execv需要一个char*const argv[],这有帮助吗?必须有某种方法进行强制转换,否则如何使用带有可变参数的exec?@nullUser:强制转换在这里对您没有帮助。您必须单独构建该argv。argv是指针数组。您的缓冲区是一个数组数组,这是完全不同的事情。看到他了吗
re:有关详细信息。@nullUser您应该在问题中提及您的要求在分配字符串文字时,您只需执行char*buffer[]={您好,World;printf%s%s\n,buffer[0],buffer[1];@DavidC.Rankin将其与buffer[10][20]集成有点困难;。我很确定使用它会导致类型冲突。也许strncpy会是一个更好的选择。在分配字符串文本的情况下,您可以简单地执行char*buffer[]={您好,World;printf%s%s\n,buffer[0],buffer[1];@DavidC.Rankin将其与buffer[10][20]集成有点困难我相当肯定使用它会导致类型冲突。也许strncpy会是一个更好的选择。