-1
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
typedef struct  {
    char name[128], code[128];
} info;
info db[3];
info* data=db;
void find (const char *code, int size, ...) {

    bool mismatch = true;
    va_list arg;
    va_start(arg,size);
    while (size-- > 0) {
        data = va_arg(arg,info*);
        printf("%s", data->code);
        if (!strcmp(data->code,code)) 
        {
            printf("%s [id:%s]\n",data->name,data->code), mismatch = false;
            }
    }
    if (mismatch) printf("No data available!");
    return;
}

int main (int argc, char *argv[], char *envp[]) {

    const char *spec[] = {
        "Physics of Elementary Particles",
        "Physics of Hign Energy",
        "Low-level Programming"
    };
    const char *code[] = {
        "2396","0812", "0773"
    };`enter code here`
    for (int count = 0; count < 3; ++count) {
        strncpy(db[count].name,spec[count],128);
        strncpy(db[count].code,code[count],128);
    }
    find("0812",3,db[0],db[1],db[2]);

    return 0;
}

运行后它说“读取访问冲突”,虽然我希望一切都是正确的,但它发生在函数“va_arg(arg,info*)”之后。堆栈或解密有问题吗?

4

1 回答 1

0

问题出在函数调用中:

find("0812",3,db[0],db[1],db[2]);

您传入的可变参数是 type info。但是,当您检索它们时,va_arg您正在寻找一个info *. 这些不匹配。

您想传入每个数组成员的地址。

find("0812",3,&db[0],&db[1],&db[2]);

此外,您需要在返回之前致电va_end底部。find

于 2020-05-31T19:29:39.313 回答