Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.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源文件之间的函数指针操作导致编译时错误_C++_C_Function_Pointers_Header Files - Fatal编程技术网

C++ 两个c源文件之间的函数指针操作导致编译时错误

C++ 两个c源文件之间的函数指针操作导致编译时错误,c++,c,function,pointers,header-files,C++,C,Function,Pointers,Header Files,我正在做一个小项目,帮助我更好地理解c指针/指针函数。我正在处理的应用程序由2个源(.c)文件和1个头(.h)文件组成。我在尝试将TurtleShell.c编译为“.o”文件时遇到的问题是以下错误: 通常,根据我的理解,这意味着我忘记声明放在main之后的函数,或者忘记将头文件作为#include“GetString.h”包含,和/或头文件与使用它的源文件不在同一目录(或/usr/local/include,/usr/local)中,这三个文件确实位于同一目录中,并且声明了头文件 需要注意的一点

我正在做一个小项目,帮助我更好地理解c指针/指针函数。我正在处理的应用程序由2个源(.c)文件和1个头(.h)文件组成。我在尝试将TurtleShell.c编译为“.o”文件时遇到的问题是以下错误:

通常,根据我的理解,这意味着我忘记声明放在main之后的函数,或者忘记将头文件作为#include“GetString.h”包含,和/或头文件与使用它的源文件不在同一目录(或/usr/local/include,/usr/local)中,这三个文件确实位于同一目录中,并且声明了头文件

需要注意的一点是,我试图通过函数指针访问GetString()。我过去在同一个源文件中使用过函数指针,但这是我第一次真正尝试在使用函数指针的应用程序中使用多个源文件,所以我在这个过程中做了一些假设。源代码如下:

GetString.c:

#包括
#包括
/*
此函数通过分配每个
将字符串中的字符转换为字符数组。此阵列保证
根据需要扩大规模,并将自身修剪至所需尺寸
空终止符启用后存储字符数组的内存量
处理。
*/
int GetString(void)
{
//合理设置初始数组长度。使用大小\u t是因为它的能力
//允许阵列按需要增长。
尺寸长度=32;
char*stringPtr=malloc(strLength);
if(stringPtr==NULL)
{
fprintf(stderr,“无法分配内存来保存字符数组。正在退出!\n”);
返回1;
}
printf(“输入一些输入:”);
int c=EOF;
无符号整数i=0;
//检查c(用户字符输入)的值,查看是否输入了RETURN或CTRL+c/Z
而((c=getchar())!='\n'&&c!=EOF)
{
//将输入的字符添加到字符数组的下一个索引中
stringPtr[i++]=(char)c;
//检查我们是否已经到达为char数组分配的内存的末尾
如果(i==strLength)
{
//将当前分配的内存量乘以2。
strLength*=2;
if((stringPtr=realloc(stringPtr,strLength))==NULL)
{
fprintf(stderr,“无法扩展内存以容纳字符数组。正在退出!\n”);
返回2;
}
}
}
//输入结束。这将添加null终止符以终止字符数组
stringPtr[i]='\0';
//检查是否为该阵列分配了任何未使用的内存。如果有,则
//将其缩小为输入的大小,包括null终止符
if(sizeof(stringPtr)
TurtleShell.c:

#包括
#包括
#包括“GetString.h”
内部主(空)
{
int运行=1;
(跑步时)
{
//为GetString()创建一个函数指针,这样我们就可以操作从GetString输出的字符串
int(*GetStringPtr)(无效);
GetStringPtr=&GetString;
char*string=malloc(GetStringPtr());
自由(弦);
string=NULL;
}
}
GetString.h:

\ifdef GETSTRING\u包括在内
#定义包含的GETSTRING
extern int GetString(void);
#恩迪夫
我知道这与我试图创建函数指针的方式有关,就像我将TurtleShell.c更改为以下格式一样,它可以正常工作:

#包括
#包括
#包括“GetString.h”
内部主(空)
{
int运行=1;
(跑步时)
{
char*string=malloc(GetString());
自由(弦);
string=NULL;
}
}
我对C语言很生疏,因为我只写了大约3周,所以我可能遗漏了一些明显的东西。我在谷歌上搜索过这个问题,但我发现为了找到相关的结果,这一点尤其难以准确表达。非常感谢您的帮助


我很清楚有很多好的GetString()类型的函数我可能会用到,但是,这是为了学习,因此,我正在根据需要构建自己的函数,以增加这些练习的教育价值。

Getstring.h中的
#ifdef
应该是
#ifndef
以下行没有意义: char*string=malloc(GetString())

GetString()返回0、1或2。 这意味着您正在分配0、1或2字节长的内存

如果要获取在GetString()中读取的字符串,请使用参数,即指向char指针的指针。 在这种情况下,您根本不需要函数指针

int GetString(char** string)
{
  size_t strLength = 32;
  *string = malloc(strLength);
  ...
}
不要在函数末尾释放字符串。 在你的主要功能中这样做。 您可以通过向函数传递char*来获取字符串,如下所示:

char *string;
int ret = GetString(&string); // Get the address of 'string'

净结果:“我忘了包括我的头文件”你真棒!我可以;我不相信这是个打字错误。我想我应该庆幸这不是更糟的事情。出于好奇,为什么没有函数指针它就可以工作?@AnthonyHopkins-使用
-Wall
标志编译将显示,如果没有函数指针,
GetString()
被假定为头文件定义它的内容。但是对于函数指针,这个假设是不成立的。我很感激你在这个答案上所做的努力,但是,当前的代码现在工作正常。根据你的回答,这种行为是不可能的。我遗漏了什么吗?主函数中的变量(char指针)'string'永远不会指向输入的字符串。相反,它将指向未初始化的内存
char *string;
int ret = GetString(&string); // Get the address of 'string'