【问题标题】:dynamically allocated string populated with characters results in empty string C用字符填充的动态分配的字符串导致空字符串 C
【发布时间】:2016-08-25 09:55:23
【问题描述】:
int main(){
    char *c=(char*)malloc(4*sizeof(char));
    *c='a';
    c++;
    *c='b';
    c++;
    *c='c';
    c++;
    *c='\0';
    printf("%s",c);
    return 0;
}

使用此代码,我可以打印每个字符(例如 printf("%c",*(--c)); ),但是当我尝试使用 printf("%s",c); 打印整个字符串时,程序什么也没打印!为什么会这样?

【问题讨论】:

  • 你已将c 增加到最后一个字符'\0'...所以没有可打印的内容。
  • 当你printf("%s",c); c 指向\0
  • @Jarod42 谢谢,明白了!
  • @DimChtz 谢谢,明白了!
  • 这确实是一个错误,您应该能够自己检测到(是的,包括初学者)。下次请使用调试器,单步执行并在询问之前观察变量。

标签: c string memory malloc


【解决方案1】:

指针已移动。所以它现在指向最后一个字符,即“\0”。因此,没有打印任何内容。将指针保留在另一个变量中并尝试使用它进行打印。然后它将正确打印。

尝试如下:

int main()
{
    char *p;
    char *c=(char*)malloc(4*sizeof(char));
    p = c;
    *c='a';
    c++;
    *c='b';
    c++;
    *c='c';
    c++;
    *c='\0';
    printf("%s",p);
    free(p);
    return 0;
}

【讨论】:

    【解决方案2】:

    您已将 c 增加到最后一个字符 '\0'...所以没有可打印的内容。

    您可以将代码更改为:

    int main(){
        char *p = (char*)malloc(4 * sizeof(char));
        char* c = p;
        *c = 'a';
        c++;
        *c = 'b';
        c++;
        *c = 'c';
        c++;
        *c = '\0';
        printf("%s", p);
        free(p);
        return 0;
    }
    

    int main(){
        char *c = (char*)malloc(4 * sizeof(char));
    
        c[0] = 'a';
        c[1] = 'b';
        c[2] = 'c';
        c[3] = '\0';
        printf("%s", c);
        free(c);
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      c 是pointer,因此表达式c++; 改变了指针位置。在调用c++ 3 次后,您最终会得到c 指向\0。要解决此问题,请创建一个临时指针来遍历元素。你的程序也有内存泄漏。别忘了free内存!

      【讨论】:

        【解决方案4】:

        因为您的字符串现在指向已分配字符串中的最后一个字符。 尝试类似

        int main(){
            char *c=(char*)malloc(4*sizeof(char));
            char* temp = c;
            *c='a';
            c++;
            *c='b';
            c++;
            *c='c';
            c++;
            *c='\0';
            printf("%s",c); // as a result of ++ operator, your pointer is no longer point at the beginning of string
            printf("%s,temp"); // << This will print whole string as it still pointed to the first address of the string
            free(temp);
            return 0;
        }
        

        【讨论】:

        • 内存泄漏在哪里?
        猜你喜欢
        • 2019-04-11
        • 1970-01-01
        • 2018-04-07
        • 2014-04-30
        • 1970-01-01
        • 1970-01-01
        • 2020-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多