c - C中奇怪的printf输出

标签 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;
}

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

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

但真正的问题是:

任何人都可以在这一行中找出原因

printf("4%s\n",p);

如果去掉前面的'4',那么看起来是这样

printf("%s\n",p);

该行根本不会打印?

最佳答案

您在函数 reverse 中返回了一个指向局部变量 (reversed) 的指针,问题实际上应该是:为什么它首先起作用?

这段代码 string = reversed; 将只复制指针,并再次指针的本地副本,因此它在函数外部没有任何影响。

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

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

相关文章:

构造一个循环来检查一个数字的数字之和是否能被 3 整除

c - 确定 sprintf 缓冲区大小 - 标准是什么?

c - 无法识别的指针行为

linux - 如何使用 sed 更改日志文件的输出

c - 尝试从读取的文件中 fprintf 某个字符串

C++ - 奇怪的事情,输入被颠倒了

c - 我想编译一个libcurl程序

c - C歧义中的选择排序

linux - Shell GNU-Screen -X Stuff 问题

c - printf() 的意外行为