首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将char[]添加到char** (字符串到字符串列表)

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

Stack Overflow用户
提问于 2013-06-05 21:56:51
回答 2查看 161关注 0票数 0

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

代码语言:javascript
复制
void main(void) {
    //set angles alpha (small) & beta (large)
    char ** configurations = calloc(0, sizeof(char*));
    int multiplicity = 0;

    createConfigString(4, 4, 0, configurations, 0, &multiplicity);
}

void createConfigString(int a, int b, int c, char ** configurations, int start, int * multiplicity) {
int x, i;
int strSize = 2 * (a + b + c);

for(x = a; x >= (a + (a % 2)) / 2; x--) {
    //new entry to configurations if starting a new line
    if(start == 0) {
        configurations = realloc(configurations, (*multiplicity + 1) * sizeof(char *));
        configurations[*multiplicity] = calloc(strSize, sizeof(char));
    }
    for(i = 0; i < x; i++) {
        configurations[*multiplicity][start] = "a,";
    }
    if(b == 2) {
        *multiplicity++;
        configurations[*multiplicity][start + 2 * x] = "b,b\n";
        start = 0;
        continue;
    }
    configurations[*multiplicity][start + 2 * x] = "b,b,";
    createConfigString(a - x, b - 2, c, configurations, start + 2 * x + 4, multiplicity);
}
}

但在编译时,它告诉我们它正在尝试将指针转换为行上的int

代码语言:javascript
复制
configurations[*multiplicity][start] = "a,";
configurations[*multiplicity][start + 2 * x] = "b,b\n";
configurations[*multiplicity][start + 2 * x] = "b,b,";

当我们写的时候

代码语言:javascript
复制
configurations[*multiplicity][start] = (int) "a,";

等,它会在没有任何警告的情况下编译。

我们做错了什么?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-05 22:13:19

既然configurationschar **,那么configurations[n]就是char *,那么configurations[n][m]就应该是char。您正在尝试将char *赋值给char,为此,编译器必须将指针转换为整数类型,然后将其截断为char大小。这通常不是程序员想要的,所以它会生成警告,让你知道你可能做错了什么。将强制转换放入会告诉编译器“是的,我真的想这样做,所以不要警告我”。然而,它可能仍然不会像你想的那样做……

此外,还有以下内容:

代码语言:javascript
复制
char ** configurations = calloc(0, sizeof(char*));

是潜在的问题。Linux上calloc的手册页上有这样的内容:

代码语言:javascript
复制
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上,它看起来是可以的),这也不需要检查……

票数 3
EN

Stack Overflow用户

发布于 2013-06-05 22:12:04

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

所以:

代码语言:javascript
复制
    configurations[*multiplicity][start] = "a,";

应该是:

代码语言:javascript
复制
    strcpy(configurations[*multiplicity][start], "a,");

和其他地方相同类型的模式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16941904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档