for循环突然停止C.

use*_*417 1 c string pointers loops for-loop

嘿伙计们,我在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;
}
Run Code Online (Sandbox Code Playgroud)

我得到了预期的输出:

cccccccccccc
Run Code Online (Sandbox Code Playgroud)

但是当我在我的方法中使用传递的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;
}
Run Code Online (Sandbox Code Playgroud)

我只是得到这个输出:

cccc
Run Code Online (Sandbox Code Playgroud)

请告诉我我做错了什么.我不知道错误是什么?

谢谢你的帮助!

Sad*_*que 6

这条线就是问题所在

  int len = strlen(out);
  out[len] = c;
  out[len+1] = '\0';
Run Code Online (Sandbox Code Playgroud)

out未初始化.您没有在此声明中分配内存:

char* out;
Run Code Online (Sandbox Code Playgroud)

所以你遇到了未定义的行为.

第3.4.3节

1未定义的行为

使用不可移植或错误的程序结构或错误数据时的行为,本国际标准不对此要求

第4.1节:

可以将非函数非数组类型T的左值(3.10)转换为右值.如果T是不完整类型,则需要进行此转换的程序格式不正确.如果左值引用的对象不是类型T的对象,并且不是从T派生的类型的对象,或者如果对象未初始化,则需要此转换的程序具有未定义的行为.如果T是非类型,则rvalue的类型是T的非限定版本.否则,rvalue的类型是T.

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

你必须分配内存:

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

一定要包括stdlib.h.

out现在指向一个可以容纳50 char秒的内存块.