首页 > 解决方案 > 一个带有意外输出的简单 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));
        }

标签: cprintf

解决方案


您在第一个循环中分配str了两次。ret[3]并且ret[4]都指向相同的内存地址。当您在第二个循环中输出数组时,您将因此得到5两次,因为它的值在前一个循环中被覆盖。

该语句*(ret+i) = str;不复制变量的值str,而只是指向ret+1的地址str。的地址在使用为其字节赋值str时不会改变。sprintf


推荐阅读