C中的奇怪printf输出

nop*_*ope 0 c printf output

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

char * reverse(char *string);
int main(int argc, char *argv[])
{
    char array[10];
    array[0] = 'a';
    array[1] = 'b';
    array[2] = 'c';
    array[3] = 'd';
    array[4] = 'e';
    printf("1%s\n",array);
    char *p = reverse(array);
    printf("4%s\n",p);
    printf("5%s\n",array);
}

char * reverse(char *string)
{
    int size = strlen(string);
    char reversed[size];
    int i;
    int j = 0;
    for(i = size-1; i >= 0; i--)
    {
        reversed[j] = string[i];
        j++;
    }
    printf("2%s\n",reversed);
    string = reversed;
    printf("3%s\n",string);
    return reversed;
}
Run Code Online (Sandbox Code Playgroud)

此代码基本上只是初始化一个值数组并将其传递给一个反转这些值的方法.

我不确定这是否是执行任务的最佳方式,因为我不熟悉C中的指针和数组.

但真正的问题是:

任何人都可以找出为什么在这一行

printf("4%s\n",p);
Run Code Online (Sandbox Code Playgroud)

如果你删除前面的'4',所以它看起来像这样

printf("%s\n",p);
Run Code Online (Sandbox Code Playgroud)

这条线根本不打印?

izo*_*ica 7

您在返回一个指针到局部变量(reversed在函数)reverse的问题实际上应该是:Why did it work in the first place?.

此代码string = reversed;仅复制指针,并再次复制指针的本地副本,使其在函数外部无效.

要反转字符串,您不需要额外的内存 - 这可以就地完成.