Return 函数中的语句从不打印到屏幕
Return statement in function never prints to screen
我试图将一些参数传递给一个函数,将这些值存储到结构中的一组元素中。然后通过调用另一个函数从结构中打印这些值。
这是我正在尝试做的事情:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct temp
{
int num;
char * name;
struct temp * nextPtr;
}temp;
temp * test();
char * printTest(temp * print);
int main (void)
{
test("TV",200);
struct temp * t;
printTest(t);
return 0;
}
temp * test(char * name, int num)
{
struct temp * mem = malloc(sizeof(struct temp));
mem->name = malloc(sizeof(strlen(name) + 1));
mem->name = name;
mem->num = num;
mem->nextPtr = NULL;
return mem;
}
char * printTest(temp * print)
{
char * output;
output = malloc(sizeof(struct temp));
print = malloc(sizeof(struct temp));
sprintf(output,"It's name is %s, and it costs %d",print->name,print->num);
return output; //should print "TV" and costs "200"
}
函数 printTest
似乎没有打印出任何东西,相反,如果我在其中硬核 printf,它会打印空值和零。但是,我尝试在 test
函数中打印结构值,该函数在初始化值后确实有效。
例如,如果我执行 printf("%d",mem->num);
这确实打印出值 200(在 test
函数中)。
但是最后一个函数中的 sprintf 和 return 组合不会产生相同的结果。任何帮助将不胜感激!
您没有从测试中获取 return 的值,因此它会丢失:
int main (void)
{
//changed to capture return value of test.
struct temp * t = test("TV",200);
printTest(t);
return 0;
}
还有你的打印功能是错误的:
// this now points to the struct you allocated in test.
char * printTest(temp * print)
{
char * output;
// you don't really want the size of temp here, you want the size
// of your formatted string with enough room for all members of the
// struct pointed to by temp.
output = malloc(sizeof(struct temp));
// you're not using this.
print = malloc(sizeof(struct temp));
// you sprintf from a buffer pointing to nothing, into your output buffer
// writing past the memory you actually allocated.
sprintf(output,"It's name is %s, and it costs %d",print->name,print->num);
// return doesn't print anything, it simply returns the value that your
// function signature specifies, in this case char *
return output; //should print "TV" and costs "200"
}
试试这个,您将获取分配的指针,并使用 printf
将格式化字符串写入标准输出:
// we're not returning anything
void printTest(temp * print ){
if (temp == NULL ){
// nothing to print, just leave.
return;
}
printf("It's name is %s, and it costs %d",print->name,print->num);
return;
}
还有一些关于你的测试函数的注释:
// char is a pointer to a string, from your invocation in main, this is
// a string stored in static read only memory
temp * test(char * name, int num)
{
// you malloc memory for your struct, all good.
struct temp * mem = malloc(sizeof(struct temp));
// you malloc space for the length of the string you want to store.
mem->name = malloc(sizeof(strlen(name) + 1));
// here's a bit of an issue, mem->name is a pointer, and name is a pointer.
// what you're doing here is assigning the pointer name to the variable
// mem->name, but you're NOT actually copying the string - since you
// invoke this method with a static string, nothing will happen and
// to the string passed in, and you'll be able to reference it - but
// you just leaked memory that you allocated for mem->name above.
mem->name = name;
// num is not apointer, it's just a value, therefore it's okay to assign
// like this.
mem->num = num;
mem->nextPtr = NULL;
return mem;
}
试试这个:
temp * test(char * name, int num)
{
struct temp * mem = malloc(sizeof(struct temp));
// we still malloc room for name, storing the pointer returned by malloc
// in mem->name
mem->name = malloc(sizeof(strlen(name) + 1));
// Now, however, we're going to *copy* the string stored in the memory location
// pointed to by char * name, into the memory location we just allocated,
// pointed to by mem->name
strcpy(mem->name, name);
mem->num = num;
mem->nextPtr = NULL;
return mem;
}
此外,sprintf
输出到一个字符串。它不输出到标准输出,即打印到屏幕,不像 printf
那样。您可能想在 output
字符串上调用 printf
或 puts
。
问题比乍一看要多得多。这是一个清理过的版本。您不能分配字符串(例如 mem->name = name;
)。您可以为 mem->name
分配,然后为它分配 strncpy
名称,或者使用 strdup
分配并立即复制。在 printTest
中,您必须为 output
分配 space 足以容纳格式字符串的静态部分 plus print->name
和 print->num
。请查看以下内容,如果您有任何问题,请告诉我。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct temp
{
int num;
char * name;
struct temp * nextPtr;
}temp;
temp * test(char * name, int num);
char * printTest(temp * print);
int main (void)
{
struct temp * t = test("TV",200);
// struct temp * t;
printf ("%s\n", printTest(t));
return 0;
}
temp * test(char * name, int num)
{
struct temp * mem = malloc(sizeof(struct temp));
// mem->name = malloc(sizeof(strlen(name) + 1));
// mem->name = name;
mem->name = strdup (name);
mem->num = num;
mem->nextPtr = NULL;
return mem;
}
char * printTest(temp * print)
{
char *output = NULL;
// output = malloc(sizeof(struct temp));
// print = malloc(sizeof(struct temp));
output = malloc (strlen (print->name) + sizeof print->num + 30);
sprintf(output,"It's name is %s, and it costs %d",print->name,print->num);
return output; //should print "TV" and costs "200"
}
输出
$ ./bin/struct_rtn
It's name is TV, and it costs 200
这一行:'sprintf(output,"It's name is %s, and it costs %d",print->name,print->num)' 需要进行一些重大修改。 1) 源字段" print->name 和 print->num 在分配的内存段中但是,它们从未被设置为任何特定值,因此它们包含垃圾。目标指针 'output' 指向一个分配的内存区域,但是该区域不大于源区域,(通常,它应该被格式化为 'temp' 结构,而不是一个长字符串。并且因为它只是临时文件的大小结构,sprintf 格式参数中的所有额外字符将没有空间。结果将是未定义的行为,因为 sprintf 的输出将超出分配的内存区域
我试图将一些参数传递给一个函数,将这些值存储到结构中的一组元素中。然后通过调用另一个函数从结构中打印这些值。
这是我正在尝试做的事情:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct temp
{
int num;
char * name;
struct temp * nextPtr;
}temp;
temp * test();
char * printTest(temp * print);
int main (void)
{
test("TV",200);
struct temp * t;
printTest(t);
return 0;
}
temp * test(char * name, int num)
{
struct temp * mem = malloc(sizeof(struct temp));
mem->name = malloc(sizeof(strlen(name) + 1));
mem->name = name;
mem->num = num;
mem->nextPtr = NULL;
return mem;
}
char * printTest(temp * print)
{
char * output;
output = malloc(sizeof(struct temp));
print = malloc(sizeof(struct temp));
sprintf(output,"It's name is %s, and it costs %d",print->name,print->num);
return output; //should print "TV" and costs "200"
}
函数 printTest
似乎没有打印出任何东西,相反,如果我在其中硬核 printf,它会打印空值和零。但是,我尝试在 test
函数中打印结构值,该函数在初始化值后确实有效。
例如,如果我执行 printf("%d",mem->num);
这确实打印出值 200(在 test
函数中)。
但是最后一个函数中的 sprintf 和 return 组合不会产生相同的结果。任何帮助将不胜感激!
您没有从测试中获取 return 的值,因此它会丢失:
int main (void)
{
//changed to capture return value of test.
struct temp * t = test("TV",200);
printTest(t);
return 0;
}
还有你的打印功能是错误的:
// this now points to the struct you allocated in test.
char * printTest(temp * print)
{
char * output;
// you don't really want the size of temp here, you want the size
// of your formatted string with enough room for all members of the
// struct pointed to by temp.
output = malloc(sizeof(struct temp));
// you're not using this.
print = malloc(sizeof(struct temp));
// you sprintf from a buffer pointing to nothing, into your output buffer
// writing past the memory you actually allocated.
sprintf(output,"It's name is %s, and it costs %d",print->name,print->num);
// return doesn't print anything, it simply returns the value that your
// function signature specifies, in this case char *
return output; //should print "TV" and costs "200"
}
试试这个,您将获取分配的指针,并使用 printf
将格式化字符串写入标准输出:
// we're not returning anything
void printTest(temp * print ){
if (temp == NULL ){
// nothing to print, just leave.
return;
}
printf("It's name is %s, and it costs %d",print->name,print->num);
return;
}
还有一些关于你的测试函数的注释:
// char is a pointer to a string, from your invocation in main, this is
// a string stored in static read only memory
temp * test(char * name, int num)
{
// you malloc memory for your struct, all good.
struct temp * mem = malloc(sizeof(struct temp));
// you malloc space for the length of the string you want to store.
mem->name = malloc(sizeof(strlen(name) + 1));
// here's a bit of an issue, mem->name is a pointer, and name is a pointer.
// what you're doing here is assigning the pointer name to the variable
// mem->name, but you're NOT actually copying the string - since you
// invoke this method with a static string, nothing will happen and
// to the string passed in, and you'll be able to reference it - but
// you just leaked memory that you allocated for mem->name above.
mem->name = name;
// num is not apointer, it's just a value, therefore it's okay to assign
// like this.
mem->num = num;
mem->nextPtr = NULL;
return mem;
}
试试这个:
temp * test(char * name, int num)
{
struct temp * mem = malloc(sizeof(struct temp));
// we still malloc room for name, storing the pointer returned by malloc
// in mem->name
mem->name = malloc(sizeof(strlen(name) + 1));
// Now, however, we're going to *copy* the string stored in the memory location
// pointed to by char * name, into the memory location we just allocated,
// pointed to by mem->name
strcpy(mem->name, name);
mem->num = num;
mem->nextPtr = NULL;
return mem;
}
此外,sprintf
输出到一个字符串。它不输出到标准输出,即打印到屏幕,不像 printf
那样。您可能想在 output
字符串上调用 printf
或 puts
。
问题比乍一看要多得多。这是一个清理过的版本。您不能分配字符串(例如 mem->name = name;
)。您可以为 mem->name
分配,然后为它分配 strncpy
名称,或者使用 strdup
分配并立即复制。在 printTest
中,您必须为 output
分配 space 足以容纳格式字符串的静态部分 plus print->name
和 print->num
。请查看以下内容,如果您有任何问题,请告诉我。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct temp
{
int num;
char * name;
struct temp * nextPtr;
}temp;
temp * test(char * name, int num);
char * printTest(temp * print);
int main (void)
{
struct temp * t = test("TV",200);
// struct temp * t;
printf ("%s\n", printTest(t));
return 0;
}
temp * test(char * name, int num)
{
struct temp * mem = malloc(sizeof(struct temp));
// mem->name = malloc(sizeof(strlen(name) + 1));
// mem->name = name;
mem->name = strdup (name);
mem->num = num;
mem->nextPtr = NULL;
return mem;
}
char * printTest(temp * print)
{
char *output = NULL;
// output = malloc(sizeof(struct temp));
// print = malloc(sizeof(struct temp));
output = malloc (strlen (print->name) + sizeof print->num + 30);
sprintf(output,"It's name is %s, and it costs %d",print->name,print->num);
return output; //should print "TV" and costs "200"
}
输出
$ ./bin/struct_rtn
It's name is TV, and it costs 200
这一行:'sprintf(output,"It's name is %s, and it costs %d",print->name,print->num)' 需要进行一些重大修改。 1) 源字段" print->name 和 print->num 在分配的内存段中但是,它们从未被设置为任何特定值,因此它们包含垃圾。目标指针 'output' 指向一个分配的内存区域,但是该区域不大于源区域,(通常,它应该被格式化为 'temp' 结构,而不是一个长字符串。并且因为它只是临时文件的大小结构,sprintf 格式参数中的所有额外字符将没有空间。结果将是未定义的行为,因为 sprintf 的输出将超出分配的内存区域