Tag: 指针

指针 – 数组和指针之间的区别

a,&a,第一个元素a [0]的地址有什么区别? 类似地,p是指向整数但指定为数组地址的指针。 指针[]是否会执行指针运算并根据数据类型获取值? *期望什么价值? 它应该是指针吗? #include int main() { int a[]={5,6,7,8}; int *p= a; printf(“\nThis is the address of a %u, value of &a %u ,Address of first element %u , Value pointed by a %u”,a,&a,&a[0],*a); printf(“\nThis is the address at p %u , value at p %u and the value pointed by p […]

为什么C中的数组会衰减到指针?

[这是一个受到其他地方最近讨论的启发的问题,我会用它来提供答案。] 我想知道数组“衰减”指针的奇怪C现象,例如当用作函数参数时。 这似乎是不安全的。 用它明确地传递长度也是不方便的。 我可以通过其他类型的聚合 – 结构 – 完全符合价值; 结构不会腐烂。 这个设计决定背后的理由是什么? 它如何与语言集成? 为什么结构有区别?

“malloc(sizeof(struct a *))”和“malloc(sizeof(struct a))”是否相同?

这个问题是Malloc调用崩溃的延续,但在其他地方有效 我尝试了以下程序,我发现它工作(即没有崩溃 – 这也在上面提到的链接中提到)。 我很幸运能让它工作但是我正在寻找SO专家对于它为何起作用的合理解释?! 以下是使用malloc() wrt structures和pointers分配memory一些基本知识 malloc(sizeof(struct a) * n)分配n个类型struct a元素。 并且,可以使用pointer-to-type-“struct a”的pointer-to-type-“struct a”来存储和访问该存储器位置。 基本上是一个struct a * 。 malloc(sizeof(struct a *) * n)分配n个类型struct a *元素。 然后,每个元素都可以指向struct a类型的元素。 基本上malloc(sizeof(struct a *) * n)分配一个array(n-elements)-of-pointers-to-type-“struct a” 。 并且,可以使用pointer-to-(pointer-to-“struct a”)来存储和访问所分配的存储器位置。 基本上是一个struct a ** 。 所以当我们创建一个array(n-elements)-of-pointers-to-type-“struct a” ,就是这样 有效将其分配给struct a *而不是struct a ** ? 有效访问/取消引用已分配的array(n-elements)-of-pointers-to-type-“struct a”使用pointer-to-“struct a” ? […]

将char 转换为char **导致段错误?

好吧我的C有点生疏,但我想我会在C中制作我的下一个(小)项目,所以我可以对它进行修改,不到20行,我已经有了一个seg错误。 这是我的完整代码: #define ROWS 4 #define COLS 4 char main_map[ROWS][COLS+1]={ “a.bb”, “ac”, “adc.”, “.dc.”}; void print_map(char** map){ int i; for(i=0;i<ROWS;i++){ puts(map[i]); //segfault here } } int main(){ print_map(main_map); //if I comment out this line it will work. puts(main_map[3]); return 0; } 我对这是如何导致段错误感到困惑。 从[][]为**时发生了什么? 这是我得到的唯一警告。 rushhour.c:23:3:警告:从不兼容的指针类型传递’print_map’的参数1 rushhour.c:13:7:注意:预期’char **’但参数类型为’char(*)[5]’ [][]和**真的不兼容指针类型吗? 它们似乎只是我的语法。

为什么scanf不需要字符串的&符号,也适用于printf(在C中)?

我现在正在学习C中的字符串。 如何使用scanf获取你可以做的字符串 scanf(“%s”,str1); 而对于printf你可以做到 printf(“The string is %s\n”, str1); 我理解,对于scanf来说,这是因为字符串只是一个字符数组,它是一个指针,但是对于printf,你怎么能像输入int或float一样放置变量名?

使用intptr_t而不是void *?

使用intptr_t作为通用存储(保存指针和整数值)而不是void*是一个好主意吗? (如下所示: http : //www.crystalspace3d.org/docs/online/manual/Api1_005f0-64_002dBit-Portability-Changes.html ) 对于我已经读过的内容: int – > void* – > int roundtrip不保证保持原始值; 我猜int – > intptr_t – > int会做 void*和intptr_t上的指针算术需要强制转换,所以没有人在这里获得优势 void*表示存储指针时显式转换次数较少, intptr_t表示存储整数值时转换次数较少 intptr_t需要C99 还有什么我应该考虑的?

如何在C中打印内存地址

我的代码是: #include #include void main() { char string[10]; int A = -73; unsigned int B = 31337; strcpy(string, “sample”); // printing with different formats printf(“[A] Dec: %d, Hex: %x, Unsigned: %u\n”, A,A,A); printf(“[B] Dec: %d, Hex: %x, Unsigned: %u\n”, B,B,B); printf(“[field width on B] 3: ‘%3u’, 10: ‘%10u’, ‘%08u’\n”, B,B,B); // Example of unary address […]

检查指针是否指向堆上已分配的内存

我想知道指针是否指向一个用malloc / new分配的内存。 我意识到任意地址的答案是“不,你不能”,但我认为可以覆盖malloc / free并跟踪分配的内存范围。 您是否知道提供此特定工具的内存管理库? 你知道生产代码的东西吗? Valgrind很棒,但是仪表太多了(慢)并且Will说我们不想像这样使用Valgrind(使软碰撞变得足够好)。 Mudflap是一个非常好的解决方案,但是专门用于GCC,遗憾的是,检查不会简单地返回布尔值(请参阅下面的答案)。 请注意,检查内存写入是否合法是一个安全问题 。 所以寻找表现是有动力的。

printf(“%p”)并转换为(void *)

在最近的一个问题中,有人提到当使用printf打印指针值时,调用者必须将指针强制转换为void *,如下所示: int *my_ptr = …. printf(“My pointer is: %p”, (void *)my_ptr); 对于我的生活,我无法弄清楚为什么。 我发现了这个问题 ,几乎是一样的。 问题的答案是正确的 – 它解释了整数和指针的长度不一定相同。 当然,这是正确的,但是当我已经有一个指针时,就像上面的情况一样,我为什么要从int *为void * ? 什么时候int *与void *不同? 事实上,什么时候(void *)my_ptr生成的任何机器代码都与my_ptr不同? 更新:多个知识渊博的响应者引用了标准,说传递错误的类型可能会导致未定义的行为。 怎么样? 我希望printf(“%p”, (int *)ptr)和printf(“%p”, (void *)ptr)生成完全相同的堆栈帧。 两个调用何时生成不同的堆栈帧?