我正在尝试解决leetcode506。(相对等级问题)。 这是尚未完成的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
ans:
else
{
char *str=malloc(sizeof(char)*10);
sprintf(str,"%d",nums[i]);
*(ret+i)=str;
//printf("%s ",*(ret+i));
}
答案 0 :(得分:3)
您在第一个循环中分配了两次str
。 ret[3]
和ret[4]
都指向相同的内存地址。输出数组时,在第二个循环中,您将获得两次5
,因为其值在上一个循环中被覆盖。
语句*(ret+i) = str;
不会复制变量str
的值,而只是将ret+1
指向str
的地址。使用str
为其字节分配值时,sprintf
的地址不变。