Tag: 指针

棘手的指针问题

我在上面的链接中找到了关于c指针的过去考试问题,我在这里找到了一个问题, http://www.cl.cam.ac.uk/teaching/exams/pastpapers/y2007p3q4.pdf 问题是: AC程序员正在使用一个小端机器,一个字节为8位,一个字为4个字节。 编译器支持未对齐访问,并使用1,2和4字节分别存储char,short和int。 程序员编写以下定义(右下方)来访问主存储器中的值(左下方): 地址字节偏移量 ——— 0 –1– 2– 3 0x04 | 10 00 00 00 0x08 | 61 72 62 33 0x0c | 33 00 00 00 0x10 | 78 0c 00 00 0x14 | 08 00 00 00 0x18 | 01 00 4c 03 0x1c | 18 00 00 00 int […]

带有指针初始化的C struct

当实例化包含结构指针数组的结构时,我保证结构数组成员中的所有指针都将设置为NULL吗? 这是一个示例结构: typedef struct mmNode { int val; int board[2][NUM_PITS+1]; int side; struct mmNode* children[NUM_PITS+1]; } mmNode; IE:如果我创建mmNode结构的实例,mmNode.children的元素mmNode.children总是设置为NULL ?

不完整数组类型的p 和* p的等价性

考虑以下代码(它是由于此讨论而产生的): #include void foo(int (*p)[]) { // Argument has incomplete array type printf(“%d\n”, (*p)[1]); printf(“%d\n”, p[0][1]); // Line 5 } int main(void) { int a[] = { 5, 6, 7 }; foo(&a); // Line 10 } GCC 4.3.4 抱怨错误消息: prog.c: In function ‘foo’: prog.c:5: error: invalid use of array with unspecified bounds GCC 4.1.2中的相同错误消息,似乎是-std=c99 , […]

在刚刚超过数组末尾的指针上调用长度为零的memcpy是否合法?

正如在其他地方所解释的那样,即使长度参数为零,调用具有无效或NULL指针的memcpy函数也是未定义的行为。 在这样一个函数的上下文中,尤其是memcpy和memmove ,是一个指针刚刚超过数组末尾的一个有效指针? 我问这个问题,因为一个指针刚好超过一个数组的末尾是合法的(相反,例如一个指针超过一个数组末尾的两个元素),但你不能取消引用它,但是脚注106 ISO 9899:2011表明这样的指针指向程序的地址空间,这是指针根据§7.1.4有效所需的标准。 这种用法发生在我想在一个数组的中间插入一个项目的代码中,要求我在插入点之后移动所有项目: void make_space(type *array, size_t old_length, size_t index) { memmove(array + index + 1, array + index, (old_length – index) * sizeof *array); } 如果我们想在数组的末尾插入,则index等于length , array + index + 1指向刚好超过数组的末尾,但复制元素的数量为零。

指针占用了多少字节?

我对指针和它们占用的字节有点困惑。 在我的教科书中,它首先说16位系统上的指针占用2个字节,32位系统占用4个字节,64位系统占用8个字节,依此类推。 然后是10行,它表示指针占用了许多字节,这是保存地址所需的。 这是我的问题: 那么这是否意味着如果我们可以说在64位系统上,地址最多需要8个字节? 如果我们在16位系统上,指针占用2个字节,并且地址需要更多2个字节,那么会发生什么?

GCC会内联一个带指针的函数吗?

我有一个函数,它对一段数据进行操作(比方说,一个int ),我想通过传递对valule的引用来改变它。 因此,我有函数: void myFunction(int *thing) { … } 。 当我使用它时,我称之为: myFunction(&anInt) 。 由于我的function经常被调用(但是来自许多不同的地方),我担心它的性能。 我将其重构为函数的原因是可测试性和代码重用。 编译器是否能够优化函数,将其内联直接在我的anInt变量上运行? 我希望你能按照它所要求的精神来接受这个问题(即我不会过早地担心优化问题,我对答案感到好奇)。 同样,我不想把它变成一个宏。

C基本字符串返回函数

我仍然是C的新手。我仍然不了解指针。 我正在尝试创建一个返回String的方法。 这是function,它仍然不完整。 char getS(char *fileName){ FILE *src; if((src = fopen(fileName, “r”)) == NULL){ printf(“%s %s %s”, “Cannot open file “, fileName, “. The program is now ending.”); exit(-1); } char *get = ” “; //insert getting a random word here return(*get); } 而我正试着这样调用这个方法 char *article = getS(“articles.txt”); char *noun = getS(“nouns.txt”); char *verb = […]

C编程:将int指针转换为int?

假设我有一个名为ptr的void *。 我应该如何使用ptr来存储int? 写作是否足够 ptr = (void *)5; 如果我想保存5号? 或者我必须使用malloc来保存它?

为什么需要内存对齐?

可能重复: 记忆对齐的目的 我在网上阅读了一些关于内存对齐的文章,并且可以理解,通过正确对齐的内存(采用2字节对齐),我们可以一次性快速获取数据。 但是如果我们有像一个硬件一样的内存,那么给定一个地址,为什么我们不能直接从该位置读取2字节。 喜欢: 我考虑过它。 我认为,如果记忆在奇偶组中,那么理论就适用了。 我错过了什么?

数组a和&a的起始地址

在以下两行中, char a[5]={1,2,3,4,5}; char *ptr=(char *)(&a+1); printf(“%d”,*(ptr-1)); 这在屏幕上打印5个。当使用a而不是&a时, char a[5]={1,2,3,4,5}; char *ptr=(char *)(a+1); printf(“%d”,*(ptr-1)); 这打印1 a和&a都是数组的起始地址。所以为什么这有区别? char * ptr =&a + 1; 显示警告。