关于printf造成指针*p乱码的问题

关于printf()影响指针*p结果的有关讨论,现摘取一篇网文。

int main()
{
    int stu[M][N] = {NULL};
    float* arr;
    float* MeanStuFun(int p[M][N]);
    int i,j;
    for(i=0;i<M;i++)
    {
        printf("please input the scores of NO.%d\n",i+1);
        for(j=0;j<N;j++)
            scanf("%d",&stu[i][j]);
    }
    arr=MeanStuFun(stu);
printf("\nevery student's mean score is:\n");
for(i=0;i<M;i++) printf("%8.2f",*(arr+i)); return 0; } float* MeanStuFun(int p[M][N]) { int i,j; float arr[M]={NULL}; float mean=0; for(i=0;i<M;i++) { for(j=0;j<N;j++) mean=mean+p[i][j]; arr[i]=1.0*mean/N; mean=0; } return arr; }

上面第一个printf()可以输出标题,但接下来的printf()输出的值为乱码。如果将第一个printf()移到arr=MeanStuFun(stu)前,则第二个printf()可以输出正确的结果,接下来的printf()依然得不到正确的结果。这就需要使用#include<stdlib.h>中的malloc函数。此函数用在子函数中,但作用于全局,专门为指针在中开辟一个特定大小的空间,在return 0之前需要用free()函数对占据内存进行释放,这样就可以避免printf等对指针的影响。释放时需要将malloc分配空间的首地址返回给主函数的指针变量,然后即可在主函数中进行内存的释放。

这是什么原因呢? 调用函数printf前先要将形参压,这时候要计算*arr。所以,第一条printf语句已经把参数算出来并放到栈顶保存了。然后调用printf函数(函数调用需要用到栈建立访问连和控制链,而原来的函数function执行完了,原本f是在栈顶的,所以,函数f的栈空间释放。数组空间也被释放),printf占用了栈,所以,把原来函数f的栈空间内容修改了。所以,第一条printf语句是可以得到结果的。后面因为arr空间的内容已经被修改,所以,之后的printf语句都得不到结果。
顺便再解释一下printf("%s\n",*arr);得到的为什么是乱码。
正如上面所说,先计算参数*arr的值保存栈顶。保存的值为arr的地址。然后调用printf函数,把栈顶空间内容修改了。虽然保存了地址,但是原来的内容已经修改了,所以得不到结果。

转载于:https://www.cnblogs.com/2Bthebest1/p/7102463.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果在Unicode环境下,使用`wchar_t*`类型存储中文字符出现乱码,可能是由于以下原因: 1. 源代码文件的编码:确保源代码文件以UTF-8编码保存,以便正确读取Unicode字符。 2. 终端或文本编辑器的编码:确保终端或文本编辑器支持UTF-8编码,以正确显示Unicode字符。 3. 宽字符函数的使用:在输出`wchar_t*`类型的字符串时,应该使用宽字符输出函数(如`wprintf`)而不是普通字符输出函数(如`printf`)。 以下是一个示例代码,展示了如何正确输出`wchar_t*`类型的中文字符串: ```c #include <stdio.h> #include <wchar.h> int main() { setlocale(LC_ALL, ""); // 设置当前区域为系统默认区域 wchar_t* chineseText = L"你好世界"; wprintf(L"%ls\n", chineseText); return 0; } ``` 在这个示例代码中,我们使用`setlocale`函数将当前区域设置为系统默认区域,以确保正确的字符编码。 然后,我们定义了一个宽字符指针`chineseText`,并赋值为`L"你好世界"`。这里的前缀`L`表示宽字符字符串。 最后,我们使用`wprintf`函数来输出宽字符字符串,`%ls`是格式化字符串的占位符,用于输出宽字符字符串。 如果遵循以上步骤,仍然出现中文乱码问题,可能是由于其他原因引起的。可以尝试在终端或文本编辑器中设置编码为UTF-8,或者检查操作系统的语言设置等。 希望这些信息对您有所帮助。如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值