【问题标题】:for loop suddenly stops Cfor 循环突然停止 C
【发布时间】:2015-01-08 06:43:07
【问题描述】:

大家好,我的 for 循环中发生了一件非常奇怪的事情。

当我在这里执行这段代码时:

#include <stdio.h>
#include <string.h>    
char* repeat(char c, int n);

int main(void)
{
    char* input;
    input = repeat('c', 12);

    return 0;
}

char* repeat(char c, int n)
{
    char* out;

    for (int i = 0; i < 12; ++i) //FIX ITERATION
    {
        int len = strlen(out);
        out[len] = c;
        out[len+1] = '\0';
    }

    printf("%s\n", out);
    return out;
}

我得到了预期的输出:

cccccccccccc

但是当我在我的方法中使用传递的 int 时,像这样:

char* repeat(char c, int n)
{
    char* out;

    for (int i = 0; i < n; ++i) //VARIABLE ITERATION
    {
        int len = strlen(out);
        out[len] = c;
        out[len+1] = '\0';
    }

    printf("%s\n", out);
    return out;
}

我只是把它作为输出:

cccc

请告诉我我做错了什么。我不知道错误可能是什么?

感谢您的帮助!

【问题讨论】:

    标签: c string loops pointers for-loop


    【解决方案1】:

    这行是问题

      int len = strlen(out);
      out[len] = c;
      out[len+1] = '\0';
    

    out 未初始化。您没有在此语句中分配内存:

    char* out;
    

    所以你正在体验Undefined Behavior

    第 3.4.3 节

    1 个未定义的行为

    行为,在使用不可移植或错误的 程序构造或错误数据,为此国际 标准没有要求

    第 4.1 节:

    a 的左值 (3.10) 非函数,非数组类型 T 可以是 转换为右值。如果 T 是一个 不完整的类型,一个程序 需要这种转换是 格式不正确。如果对象 左值引用不是类型的对象 T 并且不是类型的对象 派生自 T,或 如果对象是 未初始化,一个程序 需要这种转换有 未定义的行为。如果 T 是一个 非类类型,右值的类型 是 T 的 cv 不合格版本。 否则,右值的类型是 T.

    在这两个示例中,您都显示结果未定义。

    你必须分配内存:

    char * out = malloc(sizeof(char)*50); // i have used size 50 - take sufficient what you need
    //initialize it 
    out[0] = '\0';
    

    确保包含stdlib.h

    out 现在指向一个可以容纳 50 个chars 的内存块。

    【讨论】:

    • 感谢您的帮助。在这种情况下你将如何初始化。比如:char* out = &out[0]?我是 C 的新手。
    • @user3025417 您提供的尺寸取决于您的要求 - 请参阅我的编辑。
    • @user3025417:使用memset
    • @eckes:确实你为 out 分配了内存,但你仍然没有初始化它 - 我认为以这种方式传递给 strlen 仍然不是一个好主意
    • @user300234:在你的malloc 之后,你的memset 是新鲜的outmemset(out, 0, sizeof(char)*50)。然后,空的out 上的strlen 将返回0,而修改后的strlen 将返回正确的值。
    【解决方案2】:

    在函数repeat() 中,您没有为out 分配任何指向的内存。然后你尝试返回未初始化的指针。如果你动态分配内存,或者如果你让它指向一个静态数组,或者它指向一个字符串字面量,那就没问题了,但是如果它指向一个本地(自动)数组,那就是坏消息.

    您的代码表现出未定义的行为;任何行为都是有效的,因为您的代码格式错误。

    【讨论】:

      【解决方案3】:
      char* out;
      

      从未初始化,因此使用未初始化的变量会导致 UB

      你在strlen(out)中使用了未初始化的变量out

      指针out 应该指向某个有效的内存位置。

      char *out = malloc(size);
      

      【讨论】:

      • 这给了我:警告:来自 `int' 的函数 int malloc(...)' warning: initialization to char *' 的隐式声明缺少演员表
      • @user3025417 int malloc()?
      猜你喜欢
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多