【发布时间】:2017-09-26 00:17:31
【问题描述】:
我正在尝试完成以下任务:
给定功能:
int f(void *p)
取 p 的第一个字节并将其提取为字符。然后根据该字符的内容确定要提取哪些附加字节作为短整数。例如,如果我有某个字符 c 则将字节 4 和 7 提取为短整数并将它们存储在单独的变量中;如果我有某个不同的字符 d 提取字节 3、4、5 并将它们存储为单独的变量。使用此信息执行一些其他不相关的代码。我已经为此苦苦挣扎了好几个小时。
我尝试了以下方法:
int f(void *p) {
char *first = &p;
short int *third = p + 2;
short int *fifth = p + 4;
short int *seventh = p + 6;
printf("%s %s %s, %s", first, third, fifth , seventh);
}
int main(int argc, char const *argv[]) {
char test[] = "*5431234567";
f(test);
}
我的结果: ▒▒ϲ -1295010922 -1295010920, -1295010918
预期: * 4 1 3
过了一会儿,我意识到我试图取消引用无效的指针。所以我尝试了铸造:
char* c = (char*) p;
char first = (char) (*c)
printf("%s", first);
这给了我一个段错误。
我尝试了类似的短整数转换无济于事。如果这是一个有点无聊的问题,我很抱歉。我是 C 的新手,指针和引用的整个概念对我来说是新的。我的第一语言是 Java,它更宽容。
【问题讨论】:
-
你不能在
void指针上进行算术运算。 -
为什么不让
f只带一个char*参数,因为这就是你要传递给它的参数? -
形式上,您不能对
void *进行算术运算。遗憾的是,GCC 并没有强制执行这一点,并且在指针算术方面将void *视为大致相当于char *, -
@aschepler 因为这是一项任务,我必须使用该函数签名。
-
fix like this 另外如果函数
f需要是int f(void *p)的签名,你需要返回一个(int)值。
标签: c pointers void-pointers