我搞不清这里到底发生了什么事。我期望的是,输出应该是键中只有1个元素,也就是说,当我用120个字节只分配了0个位置时,有7个元素。

void add2(char **b, char *i) {
    if (!i) {
        b[0] = (char*) malloc(120);
        sprintf(b[0], "%s", "hithere");
    } else {
        strcat(b[0], "\\\\");
        strcat(b[0], i);
    }
}

void add1(char **b) {
    add2(b, NULL);
    add2(b, "one");
    add2(b, "two");
    add2(b, "three");
}

void add() {
    char *keys[2];
    int i;
    add1(keys);
    fprintf(stderr, "%s\n", keys[0]);
    for (i = 0; keys[i]; i++)
        fprintf(stderr, "%d\n", i);
    free(keys[0]);
}

int main (int argc, char** argv)
{
     add();
     add();
     return 255;
}

输出:
迄今为止








迄今为止








字符串与我预期的一样,但是我认为在0之后应该只打印0,因为0是我添加到的唯一元素。我需要能够释放每个点,而不仅仅是释放[0],但是当我将释放[I]放在输出的for循环中时,它会堆栈转储。
关于从下面的响应初始化,如果我需要一个类似于1000而不是2的数组,那么如何在不键入1000 0的情况下将它们全部初始化为0

最佳答案

/* ... */
void add() {
    char *keys[2];
/* ... */

keys是一个包含两个指向char的指针的数组,但它没有初始化。
试试这个
/* ... */
void add() {
    char *keys[2] = {0, 0}; /* explicit initialization of the two elements */
/* ... */

如果所有成员都没有显式的初始值设定项,则未初始化的成员将初始化为零(其类型的右零)。
/* ... */
void add() {
    char *keys[1000] = {42}; /* explicit initialize the first element to 42 */
                             /* and implicitly initialize all other elements to 0 */
                             /* **ATTENTION** */
                             /* initializing a pointer to 42 is wrong */
                             /* I only wrote that as an example */
/* ... */

编辑,引用标准
6.7.8初始化
语法
1个
初始值设定项:
赋值表达式
{初始值设定项列表}
{初始值设定项列表,}
初始值设定项列表:
指定点初始值设定项
初始值设定项列表,指定点初始值设定项
没有空初始值设定项列表的语法。

关于c - C有人可以告诉我这是怎么回事吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1526078/

10-11 22:02
查看更多