如果我不在功能中使用printf或动态分配,我就无法调用函数。为什么呢?

时间:2018-03-29 11:53:39

标签: c printf fgets

我使用Repl compiler

  

第一期:如果我不使用" printf"功能,我不能称之为功能。

#include <stdio.h>
#include <string.h>

char *m_strncpy(char *str1, int count) {
    int i;
    char *new_str;
    for (i = 0; i < count; i++) {
        new_str[i] = str1[i];
    }
    return new_str;
}

int main(void)
{

    char str[80];
    char *sp, e;
    int count;

    printf("Enter a string : ");
    fgets(str, sizeof(str) - 1, stdin);
    printf("The number of character : ");
    scanf("%d", &count);
    //printf("Input complete\n");
    sp = m_strncpy(str, count);
    printf("Cut string is %s\n", sp);
    return 0;
}

如果我不使用printf("Input complete\n");,则不会调用m_strncpy函数。

  

第二个问题:如果我不在m_strncpy函数中使用动态分配,我就无法调用函数。

Visual Studio 2017不允许未初始化。但是Repl编译器允许。

所以当我没有初始化char *new_str时,就无法调用它。为什么?

1 个答案:

答案 0 :(得分:0)

您的原始代码显示未定义的行为:

public function actionIndex()
{
    if (!\Yii::$app->user->isGuest) { // redirect user to artical /index if user is logged in
        return $this->redirect(['article/index']);

    }
}

你可能想要这个:

char *m_strncpy(char *str1, int count) {
    int i;
    char *new_str;                  // new_str is not initialized, it doesn't
                                    //  point anywhere
    for (i = 0; i < count; i++) {
        new_str[i] = str1[i];       // dereferencing an uninitialized pointer is undefined
                                    // behaviour, anything can happen.
    }
    return new_str;
}