c-如何返回一个char数组并在main中打印它



我构建了一个函数,该函数获取一个整数参数并返回一个char数组。

例如,对于参数13,函数应返回"0013";对于参数3,函数应返回"0003"。

但我没有得到错误,我不能用printf(getInstructionIndex(13)); 显示这个值

这是我的代码:

/* get Instruction Index how "0001" or "0010" */
char * getInstructionIndex(int index){
    char number1;
    char number2;
    char number3;
    char *str = (char *) malloc(sizeof(char) * 4);
        if(index < 10){
            number1 = '0';
            number2 = '0';
            number3 = '0';
            str[0] = number1;
            str[1] = number2;
            str[2] = number3;
            str[3] = index;
            return str;
        }
        else{
            if(index < 100 && index >= 10){
                number1 = '0';
                number2 = '0';
                str[0] = number1;
                str[1] = number2;
                str[2] = index;
                return str;
            }
            else
            {
                if(index < 1000 && index >= 100){
                    number1 = '0';
                    str[0] = '0';
                    str[1] = index;
                    return str;
                }
                else
                {
                    str[0] = index;
                    return str;
                }
            }
        }
        free(str);
}

这是我的主菜:

int main(int argc, char *argv[]){
    printf("startedn");

    printf(getInstructionIndex(13)); /* i must see 0013*/
    printf("stoppedn");
    return 0;
}

问题

  • 字符串str只分配了4个字符,对于null终止符来说不够
  • 未添加null终止符
  • 复杂逻辑
  • 内存泄漏
  • 缺少格式说明符
  • 铸造malloc返回

调整后的代码

#include <stdio.h>
#include <stdlib.h>
/* get Instruction Index how "0001" or "0010" */
char * getInstructionIndex(int index){
  /* overflow + underflow handling */
  if(index < 0 || index > 9999)return 0;
  /* allocate enough for the null terminator.. */
  char *str = malloc(sizeof(*str) * 5);
  /* error handling */
  if(!str)
  {
    return 0;
  }
  /* simplify logic, use a nice format specifier */
  sprintf(str, "%04d", index);
  return str;
}
int main(int argc, char *argv[])
{
  char *instruction_index;
  printf("startedn");
  instruction_index = getInstructionIndex(13);
  if(!instruction_index)
  {
    // error handling here..
    return 0;
  }
  /* add format string.. */
  printf("%sn", instruction_index); /* i must see 0013*/
  /* release the memory */
  free(instruction_index);
  printf("stoppedn");
  return 0;
}

输出

$ gcc -g test.c -o test
$ valgrind ./test
==2713== Memcheck, a memory error detector
==2713== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==2713== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==2713== Command: ./test
==2713== 
started
0013
stopped
==2713== 
==2713== HEAP SUMMARY:
==2713==     in use at exit: 0 bytes in 0 blocks
==2713==   total heap usage: 1 allocs, 1 frees, 5 bytes allocated
==2713== 
==2713== All heap blocks were freed -- no leaks are possible
==2713== 
==2713== For counts of detected and suppressed errors, rerun with: -v
==2713== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

参考

  • printf
  • valgrind快速启动
  • 铸造malloc

如果此代码中确实存在内存泄漏,则free应延迟到打印数组之后,例如:

char *str = getInstructionIndex(13)
printf("%s", str); /* i must see 0013*/
free(str);

如果你想打印一个函数返回的字符串,你应该使用:

printf("%s", str);

还有一件事,您在getInstructionIndex方法中构造的值需要由字符串终止符终止(否则您将在输出中得到垃圾)。

相关内容

  • 没有找到相关文章