简体   繁体   English

函数中的Return语句从不打印到屏幕

[英]Return statement in function never prints to screen

I'm trying to pass in some parameters into one function, store those values into a set of elements in a struct. 我试图将一些参数传递给一个函数,并将这些值存储到结构中的一组元素中。 Then print those values from within the struct, by calling a another function. 然后通过调用另一个函数从结构中打印这些值。

Here's what I'm trying to do: 这是我想做的事情:

#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"
}

The function printTest , doesn't seem to print out anything, rather if I hardcore printf within it, it prints null values and zero. 函数printTest似乎没有打印出任何东西,而是如果我在其中进行printf硬核化,它将打印空值和零。 However, I tried to print the struct values in the test function, which does work after initializing the values. 但是,我尝试在test函数中打印结构值,该函数在初始化值后确实起作用。

For example, if I do printf("%d",mem->num); 例如,如果我执行printf("%d",mem->num); this does print out a value of 200(In the test function). 这确实会打印出200(在test功能中)的值。

But the sprintf and return combination in the last function doesn't result in the same result. 但是最后一个函数中的sprintf和return组合不会得到相同的结果。 Any help would be much appreciated! 任何帮助将非常感激!

You're not capturing the value you return from test, therefore it just gets lost: 您没有捕获从测试返回的值,因此它会丢失:

int main (void)
{
    //changed to capture return value of test.
    struct temp * t = test("TV",200);
    printTest(t);
    return 0;
}

Also your print function is wrong: 另外,您的打印功能是错误的:

// 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"
}

Try this, you'll take the pointer you allocated, and use printf to write a formatted string to stdout: 试试这个,您将获取分配的指针,并使用printf将格式化的字符串写入stdout:

// 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;
}

Also some notes about your test function: 还有一些关于测试功能的注意事项:

// 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;
}

Try this instead: 尝试以下方法:

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;
}

There were many more problems than at first blush. 问题多于乍一看。 Here is a cleaned up version. 这是一个清理的版本。 You cannot assign a string (eg mem->name = name; ). 您不能分配字符串(例如mem->name = name; )。 You can either allocate for mem->name and then strncpy name to it, or use strdup to allocate and copy at once. 您可以为mem->name分配,然后为其分配strncpy名称,或者使用strdup一次分配和复制。 In printTest , you must allocate space for output sufficient to hold both the static part of the format string plus print->name and print->num . printTest ,您必须为output分配足够的空间,以容纳格式字符串的静态部分以及 print->nameprint->num Look over the following and let me know if you have question. 查看以下内容,如果您有任何疑问,请告诉我。

#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"
}

Output 产量

$ ./bin/struct_rtn
It's name is TV, and it costs 200

Additionally, sprintf outputs to a string. 此外, sprintf输出为字符串。 It does not output to standard out, ie print to the screen, unlike printf which does. printf不同,它不会输出到标准输出,即打印到屏幕。 You probably want to call printf or puts on your output string. 您可能要调用printfputs放在output字符串上。

this line: 'sprintf(output,"It's name is %s, and it costs %d",print->name,print->num)' needs some significant modification. 这行:'sprintf(输出,“它的名字是%s,花费%d”,print->名称,print-> num)'需要一些重大修改。 1) the source fields" print->name and print->num are within an allocated segment of memory However, they have never been set to any specific value, so they contain trash. The destination pointer 'output' points to an allocated memory area, however that area is no bigger that the source area, (and generally, it is expected to be formatted as a 'temp' struct, not as one long string. and because it is only the size of a temp struct, there will be no room for all the extra characters in the sprintf format parameter. Result will be undefined behaviour as the output from sprintf will overrun the allocated memory area 1)源字段“ print-> name和print-> num在分配的内存段内,但是它们从未设置为任何特定值,因此它们包含垃圾内容。目标指针'output'指向分配的内存区域,但是该区域不大于源区域(通常,它应该被格式化为“临时”结构,而不是一个长字符串。并且由于它只是临时结构的大小,因此sprintf format参数中的所有多余字符都没有空间,结果将是不确定的行为,因为sprintf的输出将超出分配的内存区域

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM