在对Python C模块的第一条评论中–Malloc 在特定版本的Python中失败 ,@ user694733提到将char**为void**无效。 我读了从Foo **到void **的无效转换 – 为什么隐式类型转换允许void *但不是void **? 和http://c-faq.com/ptrs/genericpp.html但有一个标准的引用,但没有真正的例子,在这种情况下,这可能是不正确的,导致错误。 考虑例如void** double**或反之亦然,是否有可能出错的情况? 为什么(从技术上讲,不只是因为它是UB)?
#include #include #include int main(void) { char* a = malloc(5 * sizeof(char)); a = “1”; free(a); } 关于上面的代码我有两个问题: 当我初始化这样的代码时,为什么代码会给free(a)带来错误: a =“1” 并且在我初始化这样的时候不会给free(a)带来任何错误: a [0] =’1’。 当我使用[0] =’1’初始化a并使用printf(“%s”,a)打印字符串a为什么我得到结果 ‘1’ 没有用’\ 0’声明第二个索引?
我想知道为什么有必要在打印内存中的地址内容之前将void指针强制转换为int *或char * ,即使我们告诉printf()函数如何解释内存中的数据? 假设我们有以下代码: int main (void) { void* c = malloc(4); printf(“%d”,*c); return 0; } 为什么不可能这样做? 所以要明确我的问题是,这是不可能的原因是什么? 编辑:在所有答案和研究之后,我仍然不确定编辑中的致命错误究竟在哪里。 我感到困惑的主要原因是我的编译器(gcc)在告诉“取消引用void指针”时只给出一个警告。 这是实际的错误吗? 据我所知,即使有警告,该程序仍应编译。 EDIT2我仍然感到困惑的是,我们有一个ERROR和WARNING的原因似乎是完全独立的,但是由同一段代码生成: pointer.c:7:13: warning: dereferencing ‘void *’ pointer printf(“%d”,*p); ^~ pointer.c:7:13: error: invalid use of void expression printf(“%d”,*p); 有些用户说只有在我们尝试使用derefenciation的结果时才会出现错误,并且警告是在我们为VOID指针实际分配内存时。 显然不是这种情况,因为如果我们删除printf行,我们确实只会得到一个警告但是完全没有一个警告。 pointer.c:6:8: warning: unused variable ‘p’ [-Wunused-variable] void * p=malloc(4);
所以现在我正在尝试实现一个deltaclock,我正在尝试的第一步是首先创建一个使用双链表的优先级队列(我稍后会做其他deltaclock的事情)。 从优先级队列中弹出的第一个元素是位于链表(或deltaClock结构)根目录的元素。 我在测试中将几个元素推送到队列中,并且在一些弹出操作之后,有一个案例,当它从几乎空的列表中弹出时会出现段错误。 当我在弹出方法中注释掉行中我说“clock-> root-> previous = 0;”时,当我弹出元素时,main方法中的程序不会出现段错误。 但是,由于前一个节点不再存在,因此需要删除指向前一个节点的指针。 当我执行pop操作时,如何才能使新root的前一个指针为null? #include #include struct deltaNode{ int tics; // source struct deltaNode* next; struct deltaNode* previous; }; struct deltaClock{ struct deltaNode* root; struct deltaNode* tail; int size; }; void initDeltaClock(struct deltaClock **clock){ (*clock) = malloc(sizeof(struct deltaClock)); (*clock)->size = 0; } void push(struct deltaClock* clock, int numberOfTics){ if(clock->root […]
我试图编译以下代码,但编译器不会这样做,因为“*对于结构体来说是非法的”是真的吗? struct String { int length; int capacity; unsigned check; char ptr[0]; } String; void main(){ char *s; String *new_string = malloc(sizeof(String) + 10 + 1); }
我的问题是:当我在C中编写函数原型时,如下所示: void foo(int *vector); 这是一回事: void foo(int vector[MAX_LENGTH]); 到函数,总是作为指针传递? 代码是一样的吗? 提前致谢。
我想知道来自C函数的返回指针是好/坏设计? 如果这是一个不好的做法,在下面的例子中,这将是一个好习惯: 问题是继续部分: c函数返回静态变量 在data.h文件中: #include #include typedef struct { int age; int number; } person; person * getPersonInfo(); 在data.c #include “data.h” static struct person* person_p = NULL; person * getPersonInfo() { person_p = (struct person*)malloc(10 * sizeof(struct person)); return person_p; } 在main.c #include “data.h” int main() { person* pointer = getPersonInfo(); return 0; } […]
我发现了一些关于标记指针的信息,其中(ab)使用类型的对齐要求将数据位存储在未使用的最低有效位中。 我想知道,你能不能对64位系统中最重要的位做同样的事情? 即使您要使用64位指针的16个最高有效位,您仍然需要超过256 TB的RAM才能重叠。 我知道理论上这是未定义的行为,但是在一些常见的操作系统(Windows / Max / Linux)中,这会如何表现? 是的,我知道这是邪恶和危险的,但这不是这个问题的意义所在。 这是一个关于将计算机程序推向极限的“假设”问题,而不是关于理智和便携式软件设计的问题。
所以我用了c和c ++的课程已经有一段时间了,我对c指针很好奇(我想在我的例子中使用new关键字,甚至认为我知道malloc是C方式)。 我总是记得我的老师总是强迫我们使用指针,她永远不会使用数组,她告诉我们当你使用指针而不是使用数组时,汇编语言中需要的命令较少。 我想继续这种良好的做法,但我似乎在努力使用指针,特别是双重assembly。 假设我想在不使用c ++字符串数据类型的情况下创建一个单词库,并且我有一个char类型的双指针。 int main() { string fileName = “file.txt”; char** wordBank = null; int wordCount = countWords(fileName); //somefunction to get word count } 现在我需要为整个银行分配一个足够大的内存空间但我不确定如何做到这一点我相信它是这样的事情? wordBank = new char*[wordCount]; 现在我需要为每个单词的大小分配特定空间,我仍然不确定aobut。 for(int i = 0; i < wordCount; i++) { wordLength = getWordLength(fileName, i); // some function to get word length of each… […]
struct node{ int data; struct node * next; }; 当我们尚未为结构“struct node”分配内存时,编译器如何为“next”成员分配内存