for 循环突然停止 C

for loop suddenly stops C

大家好,我的 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] = '[==]';
    }

    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] = '[=2=]';
    }

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

我只是得到这个作为输出:

cccc

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

感谢您的帮助!

这一行就是问题所在

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

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

char* out;

所以你正在经历 Undefined Behavior

第 3.4.3 节

1 undefined behavior

behavior, upon use of a nonportable or erroneous program construct or of erroneous data, for which this International Standard imposes no requirements

第 4.1 节:

An lvalue (3.10) of a non-function, non-array type T can be converted to an rvalue. If T is an incomplete type, a program that necessitates this conversion is ill-formed. If the object to which the lvalue refers is not an object of type T and is not an object of a type derived from T, or if the object is uninitialized, a program that necessitates this conversion has undefined behavior. If T is a non-class type, the type of the rvalue is the cv-unqualified version of T. Otherwise, the type of the rvalue is T.

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

你必须分配内存:

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

确保包含 stdlib.h.

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

char* out;

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

您正在 strlen(out)

中使用未初始化的变量 out

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

char *out = malloc(size);

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

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