我如何 return 一个字符数组并在 main 中打印它?
How can I return a char array and print it in main?
我构建了一个获取整数参数和 return 字符数组的函数。
例如,对于参数 13,函数应该 return "0013";对于 3 的参数,函数应该 return "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("started\n");
printf(getInstructionIndex(13)); /* i must see 0013*/
printf("stopped\n");
return 0;
}
这段代码中确实存在内存泄漏,free
应该延迟到打印数组之后,例如:
char *str = getInstructionIndex(13)
printf("%s", str); /* i must see 0013*/
free(str);
如果您想打印函数返回的字符串,您应该使用:
printf("%s", str);
还有一件事,您在 getInstructionIndex
方法中构造的值需要由字符串终止符 [=14=]
终止(否则您将在输出中得到垃圾)。
问题
- string
str
allocated only 4 chars, not enough for null terminator
- null terminator not added
- complex logic
- memory leak
- missing format specifier
- casting malloc return
调整后的代码
#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("started\n");
instruction_index = getInstructionIndex(13);
if(!instruction_index)
{
// error handling here..
return 0;
}
/* add format string.. */
printf("%s\n", instruction_index); /* i must see 0013*/
/* release the memory */
free(instruction_index);
printf("stopped\n");
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 quickstart
- casting malloc
我构建了一个获取整数参数和 return 字符数组的函数。
例如,对于参数 13,函数应该 return "0013";对于 3 的参数,函数应该 return "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("started\n");
printf(getInstructionIndex(13)); /* i must see 0013*/
printf("stopped\n");
return 0;
}
这段代码中确实存在内存泄漏,free
应该延迟到打印数组之后,例如:
char *str = getInstructionIndex(13)
printf("%s", str); /* i must see 0013*/
free(str);
如果您想打印函数返回的字符串,您应该使用:
printf("%s", str);
还有一件事,您在 getInstructionIndex
方法中构造的值需要由字符串终止符 [=14=]
终止(否则您将在输出中得到垃圾)。
问题
- string
str
allocated only 4 chars, not enough for null terminator- null terminator not added
- complex logic
- memory leak
- missing format specifier
- casting malloc return
调整后的代码
#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("started\n");
instruction_index = getInstructionIndex(13);
if(!instruction_index)
{
// error handling here..
return 0;
}
/* add format string.. */
printf("%s\n", instruction_index); /* i must see 0013*/
/* release the memory */
free(instruction_index);
printf("stopped\n");
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 quickstart
- casting malloc