#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;
}

这段代码基本上只是初始化一个值数组并将其传递到一个反转这些值的方法中。
我不确定这是否是执行任务的最佳方式,因为我对C中的指针和数组还不太熟悉。
但真正的问题是:
有人能找出这行的原因吗
printf("4%s\n",p);

如果删除前面的“4”,则看起来是这样
printf("%s\n",p);

这条线根本不会打印?

最佳答案

在函数reversed中返回一个指向局部变量(reverse)的指针,问题实际上应该是:Why did it work in the first place?
此代码string = reversed;将只复制指针,并再次复制指针的本地副本,使其在函数外部不起作用。
要反转字符串,不需要额外的内存—这可以在适当的位置完成。

关于c - C语言中奇怪的printf输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14361108/

10-11 05:32