c - 一个带有意外输出的简单 C 程序
问题描述
我正在尝试解决 leetcode 506。(相对等级问题)。这是尚未完成的c代码,并且有一个难题是输出是意外的。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i=0,j,nums[]={5,4,3,2,1},tmp;
char str[21];
char **ret=(char **)malloc(sizeof(*ret)*5);
for(i=0;i<5;i++) //bubble sort
{
for(j=5-1;j>i;j--)
{
if(nums[i]>nums[j])
{
tmp=nums[i];
nums[i]=nums[j];
nums[j]=tmp;
}
}
}
for(i=0;i<5;i++)
{
if(i<3)
{
if(i==0)
*(ret+i)="Gold Medal";
else if(i==1)
*(ret+i)="Silver Medal";
else
*(ret+i)="Bronze Medal";
}
else
{
sprintf(str,"%d",nums[i]);
*(ret+i)=str;
//printf("%s ",*(ret+i));
}
}
for(i=0;i<5;i++)
printf("%s ",*(ret+i));
}
我认为输出应该是:
金牌
银牌
铜牌
4
5
但实际输出是:
金牌
银牌
铜牌
5
5
答:
else
{
char *str=malloc(sizeof(char)*10);
sprintf(str,"%d",nums[i]);
*(ret+i)=str;
//printf("%s ",*(ret+i));
}
解决方案
您在第一个循环中分配str
了两次。ret[3]
并且ret[4]
都指向相同的内存地址。当您在第二个循环中输出数组时,您将因此得到5
两次,因为它的值在前一个循环中被覆盖。
该语句*(ret+i) = str;
不复制变量的值str
,而只是指向ret+1
的地址str
。的地址在使用为其字节赋值str
时不会改变。sprintf
推荐阅读
- algorithm - 在二维空间中搜索最近和最远矩形的最快方法
- python - 我想在 python 中遍历一个 txt 并更改每个单词
- java - 尝试在空对象引用上调用虚拟方法 'androidx.fragment.app.Fragment androidx.fra.app.FragmentManager.findFragmentById(int)'
- reactjs - 在 React 中更改日期
- python - 在使用随机模块时删除 tkinter 列表中不需要的字符
- c++ - 如何使用Boost获得2D点的凸包面积?
- python - 如何在 Tensorflow 2.2 中训练具有多个输入的 Keras 模型?
- python - 无法在 OSM(python)中为 png 图像选择名称
- c - 创建makefile,C
- java - 从列表中加载数据