将char[]添加到char**(字符串添加到字符串列表)

将char[]添加到char**(字符串添加到字符串列表),c,string,pointers,C,String,Pointers,程序应根据输入创建字符串。我们希望将这些字符串添加到一个列表中,该列表作为指针(指向其他char*指针)传递给函数。 代码如下所示: void主管道(void){ //设置角度α(小)和β(大) char**configurations=calloc(0,sizeof(char*)); 整数重数=0; createConfigString(4、4、0、配置、0和多重性); } void createConfigString(int a、int b、int c、字符**配置、int start、i

程序应根据输入创建字符串。我们希望将这些字符串添加到一个列表中,该列表作为指针(指向其他char*指针)传递给函数。 代码如下所示:

void主管道(void){
//设置角度α(小)和β(大)
char**configurations=calloc(0,sizeof(char*));
整数重数=0;
createConfigString(4、4、0、配置、0和多重性);
}
void createConfigString(int a、int b、int c、字符**配置、int start、int*多重性){
int x,i;
int strSize=2*(a+b+c);
对于(x=a;x>=(a+(a%2))/2;x--){
//如果启动新行,则为配置添加新条目
如果(开始==0){
配置=realloc(配置,(*多重性+1)*大小(字符*);
配置[*多重性]=calloc(strSize,sizeof(char));
}
对于(i=0;i
但在编译时,它告诉我们它试图将指针转换为行上的int

配置[*multiplity][start]=“a”;
配置[*多重性][start+2*x]=“b,b\n”;
配置[*多重性][start+2*x]=“b,b,”;
当我们写作时

配置[*multiplity][start]=(int)“a”;
它编译时没有任何警告


我们做错了什么?谢谢

您不能使用
=
复制字符串,您必须使用一个函数,例如标准的
strcpy
函数

因此:

应该是:

    strcpy(configurations[*multiplicity][start], "a,");

其他地方也有同样的模式

不能使用
=
复制字符串,必须使用一个函数,例如标准的
strcpy
函数

因此:

应该是:

    strcpy(configurations[*multiplicity][start], "a,");

其他地方也有同样的模式

既然
配置
是一个
字符**
,那么
配置[n]
就是一个
字符*
,而
配置[n][m]
则应该是一个
字符
。您正试图将
char*
分配给
char
,为此,编译器必须将指针转换为整数类型,然后将其截断为
char
大小。这通常不是编码器想要的,因此它会生成警告,让您知道您可能做错了什么。将强制类型转换告诉编译器“是的,我真的想这样做,所以不要警告我”。然而,它可能仍然没有做到你所想的那样

此外,这:

char ** configurations = calloc(0, sizeof(char*));
这可能有问题。Linux上的
calloc
手册页上有这样一句话:

If nmemb or size is 0, then calloc() returns either NULL, or
a unique pointer value that can later be successfully passed to free().

由于未检查返回值,因此可能会将空指针传递到
createConfigString
。也许您当前的平台实际上返回了一个“可用”值,但它不会是可移植的。如果它确实返回NULL,那么后面的
realloc
可能会有问题(虽然在Linux上,它似乎是可以的),您也不会检查…

好吧,因为
configurations
char**
,那么
configurations[n]
char*
,而
configurations[n][m]
则应为
字符
。您正试图将
char*
分配给
char
,为此,编译器必须将指针转换为整数类型,然后将其截断为
char
大小。这通常不是编码器想要的,因此它会生成警告,让您知道您可能做错了什么。将强制类型转换告诉编译器“是的,我真的想这样做,所以不要警告我”。然而,它可能仍然没有做到你所想的那样

此外,这:

char ** configurations = calloc(0, sizeof(char*));
这可能有问题。Linux上的
calloc
手册页上有这样一句话:

If nmemb or size is 0, then calloc() returns either NULL, or
a unique pointer value that can later be successfully passed to free().

由于未检查返回值,因此可能会将空指针传递到
createConfigString
。也许您当前的平台实际上返回了一个“可用”值,但它不会是可移植的。如果它确实返回NULL,那么后面的
realloc
可能会有问题(虽然在Linux上,它似乎可以),您也不会检查…

我真的是一个C noob,所以这个解释非常有用。谢谢我真的是个笨蛋,所以这个解释很有帮助。谢谢谢谢请注意,strcpy需要一个指针,所以它应该是strcpy(&configurations[*multiplity][start],“str”),这是否意味着当我使用“=”example str“,”example str“将被读取为指针?您希望字符从一个位置“移动”到另一个位置的任何位置。谢谢!请注意,strcpy需要一个指针,所以它应该是strcpy(&configurations[*multiplity][start],“str”),这是否意味着当我使用“=”example str“,”example str“将被读取为指针?只要您希望字符从一个位置“移动”到另一个位置。