Tag: 指针

C – 索引应用于指向指针的指针

我想问一下当C看到指向指针的索引时C会做什么; 例如: struct X { int a; int b; }; struct X ** ptr; 如果声明包含以下内容会发生什么: ptr[i] // where i is an unsigned int

如何将char数组case 和连接到C中的char指针?

我想连接两个字符’7’和’9’来形成这个字符串“79”。 首先,我初始化了变量。 (限制:我只能使用字符类型,我不能再使用另一个字符变量。) char *charac = (char *) malloc(sizeof(char) * 200); char *combined = (char *) malloc(sizeof(char) * 200); 然后我给出了charac [0]和charac [1]的值。 charac[0] = ‘7’; charac[1] = ‘9’; printf(“charac[0] : %c\n”, charac[0] ); printf(“charac[1] : %c\n”, charac[1] ); 我想连接charac [0]和charac [1] strcpy(combined, (char*)charac[0]); strcat(combined, (char*)charac[1]); printf(“combined : %s\n”, combined); free(combined); 但上面的代码不起作用。 我收到错误消息:“警告:从不同大小的整数转换为指针”。 阅读完所有意见和建议后,我获得了我想要的输出结果。 这是最终的代码: char […]

C中的Cons Cell数据结构

在构建一个小型Scheme解释器的早期阶段,我是C的新手。 对于项目的这一部分,我正在尝试构建一个简单的cons单元数据结构。 它应该采取像这样的列表 (abc) 并在内部表示如下: [ ][ ] -> [ ][ ] -> [ ][/] | | | ABC 为了测试它是否正常工作,我有一个打印function来回显输入。 这是不起作用的代码: #include #include #include #include “lexer.h” #include “parse.h” char token[20]; struct conscell { char *data; struct conscell *first, *rest; }; void S_Expression () { /* function from lexer to receive input a split into tokens […]

为什么执行无效指针初始化的程序在C中编译得很好?

我编写了一个简单的C程序,我希望它在编译时会失败,但遗憾的是它在C中编译并运行良好,但在C ++中编译失败。 考虑以下计划: #include int main() { char *c=333; int *i=333; long *l=333; float *f=333; double *d=333; printf(“c = %u, c+1 = %u”,c,c+1); return 0; } 访问此链接: http : //ideone.com/vnKZnx 我认为由于C ++的强类型检查,这个程序肯定无法在C ++中编译。 为什么这个程序用C编译? 事实上,编译器也会显示警告。 我正在使用Orwell Dev C ++ IDE(gcc 4.8.1编译器)。 我也在其他编译器(Borland Turbo C ++ 4.5)上尝试了相同的程序,通过扩展名.c保存它,并且在这个编译器上它无法编译。

顶级的C数组指针没有大小声明

此代码编译并生成我期望的输出。 #include int* ar[]; int main(void) { ar[0] = 97; ar[1] = 98; ar[2] = 99; printf(“%i\n”, ar[0]); printf(“%i\n”, ar[1]); printf(“%i\n”, ar[2]); printf(“%i\n”, ar[3]); return 0; } /* output 97 98 99 0 */ 我有一种感觉,我在很多层面上做错了。 这里有什么不良影响,它们是什么? 此外,为什么指针数组作为全局变量,而如果我在main声明它,gcc会引发错误?

在C中返回int数组

我有这个代码: 1 #include 2 #include 3 #define LENGTH(a) sizeof(a)/sizeof(a[0]); 4 5 int *getNbits(int, int, char *); 6 7 int main() { 8 char ins[] = “00001111000011110000111100001111”; 9 int *x = getNbits(0, 32, ins); 10 11 for (int i = 0; i < LENGTH(x) ; i++){ 12 13 printf("%d", *(x + i)); 14 } 15 return […]

Typecasting指向浮点指针的指针

我正在尝试做以下事情 int a[8]={1,2,3,4,5,6,7,8}; printf(“%f\n”, *(float *)a); printf(“%f\n”, *((float *)a+1)); printf(“%f\n”, *((float *)a+2)); printf(“%f\n”, *((float *)a+3)); printf(“%f\n”, *((float *)a+4)); printf(“%f\n”, *((float *)a+5)); printf(“%f\n”, *((float *)a+6)); printf(“%f\n”, *((float *)a+7)); 我明白了 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 我试图以这种方式打印元素的原因是因为,我想将指向数组的int指针强制转换为浮点指针并将其作为另一个函数的参数传递给float * 。 看来这不行。 有人可以解释为什么这不起作用? int *ptr; function((float *)ptr); 如果我这样做,该函数不会读取指针正确指向的值..只返回0.0000 。

将限定的限制指针传递给函数?

限制合格的指针被解释为有一个规则:指针访问并在任何地方修改的任何对象只能由指针访问。 所以以下不起作用吧? void agSum( int * restrict x, int n ){ for(int i=0; i<n-1; i++) x[i+1] += x[i]; } int SumAndFree( int * restrict y, int n ){ agSum(y); printf("%i",y[n-1]); free(y); } 所以,我猜这是无效的,因为y [n-1]被修改到某个地方,不能直接从限制指针y访问,而是由y读取。 如果这是正确的,当输入指针限制合格时,如何调用函数? 似乎该function在不违反限制规则的情况下无法执行任何操作。 释放限制指针是否是另一种违规行为? 我想这是一种修改。 提前致谢!

如何释放一个char指针数组?

我使用此方法将列表中的值转换为数组,以便在execvp()中使用 – 系统调用: char **list2argarray(struct shellvalue *values, int count) { char **array = (char **)malloc((count + 1) * sizeof(char *)); int i = 0; while (values) { char *word = values->word; array[i] = (char *)malloc(sizeof(word) + 1); strcpy(array[i], word); values = values->next; i++; } array[i] = NULL; return array; } 什么是释放这些数组的正确方法? 我试过像这样的东西 void freeargpointer(char **array, […]

数组指针算法 – 合法和未定义的行为

我问自己这些代码行是否会在C和C ++中产生未定义的行为。 我试着回答每一点,阅读标准关于数组下标的内容(C 6.5.6 – 8)。 我没有发布整个段落,因为它很长。 此外,如果表达式P指向数组对象的最后一个元素,则表达式(P)+1指向一个超过数组对象的最后一个元素,如果表达式Q指向一个超过数组对象的最后一个元素,表达式(Q)-1指向数组对象的最后一个元素。 如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义。 如果结果指向一个超过array> object的最后一个元素的结果,则它不应该用作被计算的一元*运算符的操作数。 1 int a[10]; 2 int b = a[9]; // ok 3 int c = a[10]; // UB 4 int* d = (a + 10); // ok 5 int* e = &a[10]; // ok from C99 (& and [] are ignored, pointer is not […]