我在使用C中的指针和数组时遇到了一些问题。这是代码: #include int *ap; int a[5]={41,42,43,44,45}; int x; int main() { ap = a[4]; x = *ap; printf(“%d”,x); return 0; } 当我编译并运行代码时,我收到此警告: [警告]赋值使得整数指针没有强制转换[默认启用] 对于第9行(ap = a [4];)并且终端崩溃。 如果我将第9行更改为不包含某个位置(ap = a;),我不会收到任何警告并且它有效。 为什么会这样? 我觉得答案很明显,但我看不出来。
我正在阅读Linux内核上的Beautiful Code中的章节,作者讨论了Linux内核如何在C语言中实现inheritance(以及其他主题)。 简而言之,定义了一个“基础”结构,为了从中inheritance,“子类”结构将基类的副本放在子类结构定义的末尾 。 然后,作者花了几页来解释一个聪明而复杂的宏,以确定要从对象的基本部分转换为对象的子类部分要返回多少字节。 我的问题:在子类struct中,为什么不将struct struct声明为struct中的第一个东西,而不是最后一个 ? 首先放置基础结构的主要优点是从基类转换到子类时根本不需要移动指针 – 本质上,执行转换只是告诉编译器让代码使用’额外’子类struct在基类定义的东西之后放置的字段。 只是为了澄清我的问题,让我抛出一些代码: struct device { // this is the ‘base class’ struct int a; int b; //etc } struct usb_device { // this is the ‘subclass’ struct int usb_a; int usb_b; struct device dev; // This is what confuses me – // why put this […]
如何删除单链接列表中的节点,只有一个指针指向要删除的节点? [开始和结束指针未知,可用信息是指向应删除的节点的指针]
我对restrict有一般性的了解,但我希望澄清一些细节。 我有一个函数从一个缓冲区读取一个以null结尾的字符串,并在另一个缓冲区中写出一个URL编码的版本。 该函数具有此签名(目前没有restrict ): char const *StringUrlEncode(char const *unencoded, char *encoded, char *encodedEnd); unencoded是我的以null结尾的源字符串。 目标缓冲区由encoded和encodedEnd表示,其中encoded指向缓冲区中的第一个char , encodedEnd指向缓冲区后的第一个char,即函数将写入char ,但不包括 encodedEnd指向的位置 – – 如果您熟悉C ++ STL约定,这是您的基本begin / end迭代器对。 如果我将restrict添加到此函数,它是否应仅应用于前两个参数: char const *StringUrlEncode(char const *restrict unencoded, char *restrict encoded, char *encodedEnd); 或者通过将它添加到所有三个参数中我是否有一些好处? 我可以看到,使输入和输出缓冲区restrict有助于编译器知道它们不重叠。 但是由于最后一个参数encodedEnd仅用于标记输出缓冲区的结尾,我认为restrict对这里的编译器没有任何帮助(虽然我认为它不会伤害,除了添加function声明中不必要的噪音)。
我今天很难修复代码,然后我遇到类似的东西: typedef struct { int a; int b; int c; int d; char* word; } mystruct; int main(int argc, char **argv){ mystruct* structptr = malloc(sizeof(mystruct)); if (structptr==NULL) { printf(“ERROR!”) … } … free(structptr); return 0; } 由于char* word是一个可变长度的字符串,而且malloc没有为它分配足够的内存,因此代码提供了大量的内存错误。 实际上它只为整个struct分配了20 Bytes 。 有没有解决这个问题的方法,而不是将char*变成像char word[50] ?
是整数或无符号数据类型的指针?
我无法理解C风格的字符串是什么。 新年快乐 我所知道的:指针包含一个内存地址。 取消引用指针将为您提供该内存位置的数据。 int x = 50; int* ptr = &x; //pointer to an integer, holds memory address of x cout << "&x: " << &x << endl; //these two lines give the same output as expected cout << "ptr: " << ptr << endl; cout << "*ptr: " << dec << (*ptr) << […]
好吧,我无法理解指针与指向数组指针的指针。 请考虑以下代码: char s[] = “Hello, World”; char (*p1)[] = &s; char **p2 = &s; printf(“%c\n”, **p1); /* Works */ printf(“%c\n”, **p2); /* Segmentation fault */ 为什么第一个printf工作,而第二个不工作? 根据我的理解,’s’是指向数组第一个元素的指针(即’H’)。 因此将p2声明为char **意味着它是指向char的指针。 使它指向’s’应该是合法的,因为’s’是指向char的指针。 因此解除引用它(即** p2)应该给出’H’。 但事实并非如此!
我试图更深入地理解C函数中的指针参数。我已经编写了一个测试程序,试图看到将单个指针传递给一个函数的双指针然后修改它之间的区别。 我有一个有两个function的程序。 第一个函数modifyMe1将单个指针作为参数,并将a属性更改为7.第二个函数modifyMe2将双指针作为参数,并将a属性更改为7。 我预计第一个函数modifyMe1将是“按值传递”,即如果我传入了我的结构指针,C将创建它指向的数据的副本。 对于后者,我正在做一个“传递参考”,它应该修改到位的结构。 但是,当我测试这个程序时,两个函数似乎都修改了结构。 我知道对于指针的性质我有一个误解是肯定的。 有人可以帮我解决这个问题吗? 谢谢! 这是我有的: #include #include struct myStructure { int a; int b; }; void modifyMe1(struct myStructure *param1) { param1->a = 7; } void modifyMe2(struct myStructure **param1) { (*param1)->a = 7; } int main(int argc, char *argv[]) { struct myStructure *test1; test1 = malloc(sizeof(test1)); test1->a = 5; test1->b = […]
char *p = “string”; //creates pointer to constant string char p[] = “string”; //just an array with “string” 我只是有点困惑为什么在第一个例子中创建一个指向常量字符串的指针? 它不应该只是一个指针指向内存中有“字符串”的地方吗?