繁体   English   中英

C有人可以告诉我这是怎么回事吗?

[英]C can someone tell me what is going on here?

我不知道这里到底发生了什么。 我所期望的是输出应该说键中只有1个元素,也就是说当我只分配0个位置和120个字节时有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;
}

输出:hithere \\一\\二\\三0 1 2 3 4 5 6 7 hithere \\一\\二\\三0 1 2 3 4 5 6 7

字符串与我期望的一样,但是我认为仅应将0打印出来,因为0是我添加到的唯一元素。 我需要能够释放每个点,而不仅仅是free [0],但是当我将free [i]放入打印出来的for循环中时,它将堆栈转储。

关于从下面的响应初始化,如果我需要一个像1000而不是2的数组,那么我如何将它们全部初始化为0而不输入1000 0

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

keys是2个指向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个

初始值设定项:

任务表达
{initializer-list}
{initializer-list,}

初始化列表:

指定opt初始化程序
初始化列表,指定优化

空的初始化列表没有语法。

您尚未初始化keys数组,因此它包含内存中所有发生的事情。 在这种情况下,keys [1]以及最多7个都不为零。

对于问题的第二部分,

如果您需要初始化一个类似于1000而不是2的数组,请使用以下命令

char *keys[1000] = {0};

如果使用值初始化数组的一个元素,则数组的所有其他成员将自动初始化为零。

即,如果您使用

char *keys[1000] = {42};

那么数组的第一个成员将被初始化为42,而数组的所有其他成员将被自动初始化为零。

将数组元素隐式初始化为0,然后使用memset()将其显式设置为0,有什么区别?

char *data[1000] = {0};
memset(data, 0, sizeof data);

第一个选项(隐式初始化)将数组的每个元素设置为适当类型的零; 第二个选项将所有元素的所有位(加上任何填充)设置为0。通常( 当前计算机的99.99% )在键入0所有位0之间没有区别。

想象一下具有分段存储器的计算机……其中的指针由两部分组成。 当将其设置为0(正确的类型为0)时,编译器可以使0与所有位0不同。如果将所有位专门设置为0,则最终可能会得到无效的指针。

void *test = 0; /* can make test something like "0xC0DE:0x0000" */
memset(test, 0, sizeof test); /* will make test as "0x0000:0x0000" */

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM