C语言在另一个函数中接收struct

时间:2018-06-09 23:25:09

标签: c function pointers struct send

当我尝试在t[1].name函数中读取equalname的值时,它将无效。如何将该值发送到另一个函数?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

struct test {
    char name[100];
    char num[100];
};

int equalname(struct test *t, char string[100]) {
    int i;
    t = malloc(sizeof(struct test)*100);
    printf("t[1].name == %s\n", t[1].name); //prints garbage(t[1].name != name)
    for (i = 0; i < 100; i++) //also, is this even right?
    {
        if (t[i].name == string) //should I use 2 for's and set t[i].name[j] == string[j]?
        {
            printf("t[i].name == name!");
            return i;
            break;
        }
    }
    printf("WRONG");
    return 0;
}

int main() {
    struct test *t;
    t = malloc(sizeof(struct test)*100);
    char name[100];
    printf("Name:\n");
    scanf("%s", name);
    strcpy(t[1].name, name);
    printf("t[1].name == %s\n", t[1].name); //this works (t[1].name == name)
    equalname(t[1].name, name);
}

1 个答案:

答案 0 :(得分:3)

好消息是你走在正确的轨道上 - 坏消息是你的赛道上有几条铁轨缺失......

首先,当您使用malloc分配内存时,内存块将被保留,但块中的所有字节仍保持未初始化。尝试访问未初始化的内存位置中的任何内容是未定义的行为 - 从那一点开始,您的代码操作不再被定义 - 它可能看似起作用,也可能是SegFault或其间的任何内容。

你有两个选择,(1)循环遍历每个结构并显式初始化值,或(2)使用calloc将所有字​​节分配并初始化为零,例如。

#define MAXN 100    /* if you need a constrant #define 1 (or more) */

struct test {
    char name[MAXN];
    char num[MAXN];
};
...    

int main() {

    int index;
    struct test *t;
    char name[MAXN] = "";
    t = calloc(MAXN, sizeof *t);    /* use calloc, or initialize values */

    if (t == NULL) {                /* validate every allocation */
        perror ("calloc-t");
        return 1;
    }

请勿在{{1​​}}中再次分配t。虽然由于C使用pass by值而不会覆盖原始地址,而equalname是来自main的t的副本 - 它也不会为您接受创建另一个未初始化的内存块。只需从t传递t并使用它,例如

main

接下来,您无法将字符串与int equalname (struct test *t, char *string) { int i; printf("t[1].name == %s\n", t[1].name); for (i = 0; i < MAXN; i++) { /* you must use strcmp to compare strings, not == */ if (strcmp (t[i].name, string) == 0) { printf ("t[i].name == name!\n"); return i; break; } } printf("WRONG"); return -1; } 进行比较。你要么必须遍历每个字符并进行比较 - 或者只是使用==(这就是它所写的内容),例如。

strcmp

接下来,您必须 验证 每个分配和每个用户输入 - 否则您将邀请未定义的行为。如果您无法验证分配并且无法验证输入 - 您可以放心,您实际上正在代码中的有效内存中处理有效数据。

完全放弃,您可以执行以下操作:

        if (strcmp (t[i].name, string) == 0)
        {
            printf ("t[i].name == name!\n");
            return i;
            break;  /* break does nothing here */
        }

示例使用/输出

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#define MAXN 100    /* if you need a constrant #define 1 (or more) */

struct test {
    char name[MAXN];
    char num[MAXN];
};

int equalname (struct test *t, char *string) 
{
    int i;

    printf("t[1].name == %s\n", t[1].name);

    for (i = 0; i < MAXN; i++)
    {   /* you must use strcmp to compare strings, not == */
        if (strcmp (t[i].name, string) == 0)
        {
            printf ("t[i].name == name!\n");
            return i;
            break;
        }
    }

    printf("WRONG");
    return -1;       /* on error return a value that cannot be a valid index */
}

int main() {

    int index;
    struct test *t;
    char name[MAXN] = "";
    t = calloc(MAXN, sizeof *t);    /* use calloc, or initialize values */

    if (t == NULL) {                /* validate every allocation */
        perror ("calloc-t");
        return 1;
    }

    printf ("Name: ");
    if (scanf ("%s", name) != 1) {  /* validate ALL user input */
        fprintf (stderr, "error: invalid input - name.\n");
        return 1;
    }
    strcpy (t[1].name, name);

    printf ("t[1].name == %s\n", t[1].name);
    index = equalname (t, name);    /* save the return! */

    if (index == -1) {  /* validate the operation of your function */
        fprintf (stderr, "string '%s' not found.\n", name);
        return 1;
    }

    printf ("string found at index '%d'.\n", index);

    return 0;
}

如果您还有其他问题,请与我们联系。