Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针和函数_C_Pointers - Fatal编程技术网

C 指针和函数

C 指针和函数,c,pointers,C,Pointers,我是C编程新手。我从库中编写了这段代码 在这个函数中,第一个参数是输入,第二个参数是输出。现在的问题是如何得到主函数中第二个参数的值? 我已经写了这段代码,但是它出错了。这里怎么了 int main(){ char *id; satno2id(68, &id); printf("satellite number is %s", *id); } 在C语言中,数组的名称降级为指向该数组第一个元素的指针 函数中的id需要指向字符数组字符串的第一个元素的指针。这一点很明

我是C编程新手。我从库中编写了这段代码

在这个函数中,第一个参数是输入,第二个参数是输出。现在的问题是如何得到主函数中第二个参数的值? 我已经写了这段代码,但是它出错了。这里怎么了

int main(){
    char *id;
    satno2id(68, &id);
    printf("satellite number is %s", *id);
}

在C语言中,数组的名称降级为指向该数组第一个元素的指针

函数中的id需要指向字符数组字符串的第一个元素的指针。这一点很明显,因为用于写入字符数组的sprintf函数在satno2id中使用

所以发送一个char数组,就像

char id[4];
satno2id(68, id);
我将数组的大小设置为4,因为satno2似乎正在写入长度为3的字符串。额外的字节用于存储\0终止符

您需要将数组传递给satno2id,而不是未初始化的指针。此外,为了避免缓冲区溢出,还需要传递数组的长度,以便函数可以断言数组足够长

#include <assert.h>

#define LEN(array) (sizeof (array) / sizeof (array)[0])

extern void satno2id(int sat, char id[], int idLen)
{
    int prn;

    assert(idLen >= 4 + 1);

    switch (satsys(sat, &prn)) {
    case SYS_GPS:
        sprintf(id, "G%02d", prn - MINPRNGPS + 1);
        break;
    case SYS_GLO:
        sprintf(id, "R%02d", prn - MINPRNGLO + 1);
        break;
    case SYS_GAL:
        sprintf(id, "E%02d", prn - MINPRNGAL + 1);
        break;
    case SYS_BDS:
        sprintf(id, "C%02d", prn - MINPRNBDS + 1);
        break;
    default:
        strcpy(id, "");
    }
}

int main(void)
{
    char id[8];

    satno2id(68, id, LEN(id));
    printf("satellite number is %s\n", id);
    return 0;
}

您所说的错误是什么?char*id;只是一个指针,它没有空间来存储值。改为尝试charid[42];如果id可以是42个字符长。您的C编译器为您提供了一些有关此代码的诊断消息。你是不是忽略了他们?
#include <assert.h>

#define LEN(array) (sizeof (array) / sizeof (array)[0])

extern void satno2id(int sat, char id[], int idLen)
{
    int prn;

    assert(idLen >= 4 + 1);

    switch (satsys(sat, &prn)) {
    case SYS_GPS:
        sprintf(id, "G%02d", prn - MINPRNGPS + 1);
        break;
    case SYS_GLO:
        sprintf(id, "R%02d", prn - MINPRNGLO + 1);
        break;
    case SYS_GAL:
        sprintf(id, "E%02d", prn - MINPRNGAL + 1);
        break;
    case SYS_BDS:
        sprintf(id, "C%02d", prn - MINPRNBDS + 1);
        break;
    default:
        strcpy(id, "");
    }
}

int main(void)
{
    char id[8];

    satno2id(68, id, LEN(id));
    printf("satellite number is %s\n", id);
    return 0;
}