我正在尝试写一个简单的列表.我有下一个代码:
#include "stdio.h"
#include "stdlib.h"
typedef struct _anObject {
void* data;
struct _anObject* previous;
struct _anObject* next;
} object_t;
typedef struct _aHead {
object_t* first;
object_t* current;
object_t* next;
object_t* last;
int index;
int size;
} head_t;
head_t* new_list(void)
{
head_t* list = malloc(sizeof(head_t));
list->first = NULL;
list->current = NULL;
list->last = NULL;
list->index = -1;
list->size = 0;
return list;
}
void add_object_to_list(head_t* list, object_t* object)
{
if (list->size == 0)
{
object->next = NULL;
object->previous = NULL;
list->first …Run Code Online (Sandbox Code Playgroud) 我正在为通过malloc构造的指针数组分配内存,并希望用零初始化它,如下所述.假设结构包含int和char [](字符串)类型的成员?那我怎么能把这个结构归零呢.
代码:假设我想分配100
struct A **a = NULL;
a = (struct **)malloc(sizeof( (*a) * 100);
for(i=1; i < 100; i++)
a[i] = (struct A*)malloc(sizeof(a));
Run Code Online (Sandbox Code Playgroud)
还请解释一下为什么有必要用零初始化.
平台:Linux,编程语言:C
我知道我们可以使用memset或bzero.我试过它它崩溃了,可能是我正确使用它所以请告诉我正确的方法.
我有一堆结构,如:
struct A { ... }
struct B { ... }
struct C { ... }
Run Code Online (Sandbox Code Playgroud)
我想设计一个函数,它可以接受这些结构的数组并遍历数组的每个元素并调用另一个函数,如:
template <typename T>
ostream& process(ostream& os, const T* array) {
// output each element of array to os (but how do we know the length?)
}
A a_array[10];
process(a_array);
Run Code Online (Sandbox Code Playgroud)
我无法显式传递数组的大小,因为进程函数实际上是operator <<()(我只是用于演示目的的进程)
更新:我不能在这里使用任何std容器.不幸的是,它必须是一个阵列!
我正在编写一个函数来解析具有纹理和动画数据的文件,并将其加载到我声明的一些全局结构中.我在特定行上收到编译器警告"从不兼容的指针类型分配".这是很多代码,所以我只想在这里发布重要的部分.
首先,我的动画例程有一个struct数据类型,如下所示:
typedef struct {
unsigned int frames;
GLuint *tex;
float *time;
struct animation *next;
} animation;
Run Code Online (Sandbox Code Playgroud)
如您所见,结构中的最后一个变量是指向动画完成时默认为另一个动画的指针.
这是加载函数的声明:
void LoadTexturePalette(GLuint **texture, animation **anim, const char *filename)
Run Code Online (Sandbox Code Playgroud)
该函数将信息加载到动画数组中,因此是双指针.
在加载每个动画的最后,从文件中提取一个整数,指示"下一个"指针将指向哪个动画(加载的动画).
fread(tmp, 1, 4, file);
(*anim)[i].next = &((*anim)[*tmp]);
Run Code Online (Sandbox Code Playgroud)
在最后一行,我得到编译器警告.我还没有使用那个变量,所以我不知道警告是否是一个问题,但我觉得我的语法或我的方法在设置该变量时可能是不正确的.
我见过一个非常奇怪的代码片段,我不太确定我是否理解它:
#include <stdio.h>
int main(char *argc, char **argv)
{
char a[50];
*(char *) (a + 2) = 'b'; // <== THE LINE WHICH CONFUSES ME
printf("value: %c\n", a[2]);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
是不是我们去2个桶进一步将'b'转换为指向b的指针然后取消引用它?
我只是在学习C++,而且我在指向方法方面遇到了困难.让我们说:
class One {
public:
int Add (int a, int b) {return a+b;}
};
typedef int (One::*pAdd) (int, int);
class Other {
public:
int Next (pAdd funct, int c){ return funct (c, 1);}
};
int main (){
One one;
Other other;
other.Next(one.Add, 2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据我的MinGW的报告,我有很多问题.首先,我没有正确调用函数,因为编译器坚持使用.*或 - >*.不知道如何纳入此请求,欢迎任何帮助.现在,我可以通过使方法静态使用c样式指针或传递对象并从Next中调用方法来解决我的问题,但我想理解指向方法的指针.基本上,我很困惑为什么一个.添加不是一个可接受的输入.调用方法是明确定义的(.Add)并符合我的typedef.另外,我从typedef提供了类(一)的实例,从而提供了执行方法的上下文.但编译器输出看起来我不仅错过了语法,而且我错过了这个概念.那么,如何将指向对象的方法作为上下文作为单个参数传递?
我写了2个程序.请仔细阅读这两个程序并帮助我理解为什么变量'i'和'*ptr'给出不同的值.
//Program I:
//Assumption: Address of i = 100, address of ptr = 500
int i = 5;
int *ptr = (int *) &i;
*ptr = 99;
cout<<i; // 99
cout<<&i;// 100
cout<<ptr; // 100
cout<<*ptr; // 99
cout<<&ptr; // 500
//END_Program_I===============
//Program II:
//Assumption: Address of i = 100, address of ptr = 500
const int i = 5;
int *ptr = (int *) &i;
*ptr = 99;
cout<<i; // 5
cout<<&i;// 100
cout<<ptr; // 100
cout<<*ptr; // 99 …Run Code Online (Sandbox Code Playgroud) 现在一个类的函数指针到另一个类的函数怎么样?那是我的问题
例:
class Apple
{
int(Apple::*pActionFunc)(void);
};
class Tree
{
Apple* tempy;
void Init( void );
int I_Work( void );
};
void Tree::Init( void )
{
tempy = new Apple( );
tempy->pActionFunc = &Tree::I_Work;
}
int Tree::I_Work( void )
{
"Do Things"
}
Run Code Online (Sandbox Code Playgroud)
那样不行.这是为什么?
例如,如果我做这样的事情:
vector<int> myvector;
myvector.push_back(100);
int * ptr = &(myvector[0]);
myvector.clear();
myvector.push_back(10);
Run Code Online (Sandbox Code Playgroud)
ptr仍然有效吗?或者它现在可能指向垃圾?
好吧,所以我最近深入研究了C++并且我已经把所有东西都搞砸了.指针最终开始有意义,直到我应该使用它们,如何正确实现它们等.
然而,有一个关于指针的基本用法的一个小问题,我仍然需要回答.我会直接跳到代码:
具有以下类别A和功能foo(A* bar)......
class A
{}
void foo(A* bar)
{}
Run Code Online (Sandbox Code Playgroud)
......以下电话之间有什么区别foo?
A* a;
A b;
foo(a);
foo(&b);
Run Code Online (Sandbox Code Playgroud)
他们都编译得很好,据我所知,我没有遇到任何问题.
我认为那A b;是在那里实例化的,而A* a;需要创建new(因为它实际上没有创建对象,它只是对潜在A对象进行了4字节的长引用).
我可以,如果我正确地考虑这个,做a = b;(编辑制作a = &b),然后成功传递a给foo.但是,如果我不这样做a = &b并foo尝试读取指向的(不存在的)对象a,则会导致运行时错误.
此外,如果以上是正确的,那么我认为我可以成功通话foo(&b);.
我对么?
谢谢!