交流
#include "b.h"
typedef struct line_details {
int line_num;
char type[20];
} line_details;
line_details* ptr = NULL;
ptr = (*line_details) malloc(sizeof(line_details));
int x = 5;
do_something(x, &ptr);
b.c
void do_something(int n, line_details* ptr)
{
/* some code */
}
b.h
void do_something(int n, line_details* ptr);
我想将指针的地址传递给函数 do_something
而不仅仅是指针的副本。当我这样做时,我得到 incompatible pointer type error
。为什么?
答案 0 :(得分:3)
您对 malloc
的转换是错误的,正确的转换是 (line_details *)
。但那是如果你甚至want to cast malloc in the first place。
ptr
已经是一个指针。您通过 &ptr
传递的是 line_details *ptr
的地址,换句话说,是一个指向指针的指针。只需通过ptr
。
如果您的意图实际上是传递一个指向 ptr
的指针(即一个指向 line_details
的指针的指针),请将函数签名改为采用 line_details **
,然后通过 &ptr
。
答案 1 :(得分:1)
代码中的几个问题如下。
如果你想对 malloc 返回的指针进行类型转换,你必须 告诉您要类型转换的指针的类型,即 '''line_details*''' 不是 '''*line_details'''
ptr 本身就是一个指针。将 ptr 传递给函数就足够了。如果传递 &ptr,则它不是指针。是指针的地址。
修改后的程序如下。
#include "b.h"
typedef struct line_details {
int line_num;
char type[20];
} line_details;
line_details* ptr = NULL;
ptr = (line_details *) malloc(sizeof(line_details));
int x = 5;
do_something(x, ptr);
如果你想传递指针的地址,你需要像下面的例子一样改变函数。
do_something(x, &ptr);
void do_something(int n, line_details** ptr)
{
/* some code */
}
答案 2 :(得分:1)
函数签名取决于函数应该用指针做什么。以下是一些示例。
...
public function genRaport
{
$date_from = $request->input("date_from");
$date_to = $request->input("date_to");
$user = $request->input("user");
return \Excel::download(new UmowyRaport($date_from, $date_to, $user), 'raport_cars_'.date('d-m-
Y').'.xlsx');
}