我知道如果将指针的地址放在堆上是不安全的,因为以后释放它会导致一些麻烦,但如果在堆栈上声明指针,那么这样做是否安全? 我在谈论这样的事情: char arr[] = “one two three”; arr++; //or arr–; 我希望通过引用char数组作为指针来实现这一点。
我正在尝试交换对象以解决使用void指针交换对象的作业问题。 我的function声明必须是: void swap(void *a, void *b, size_t size); 我不是在寻找确切的代码如何做到这一点我可以自己解决,但我不确定我是否正确理解它。 我发现有一个问题是: void *temp; temp = a; a = b; b = temp; 只更改指针指向的内容。 那是对的吗? 如果它是正确的,为什么不交换指针实际上改变* a和* b之间的内容。 因为如果你的指针指向不同的东西,你不能取消引用它,现在对象会有所不同吗? 同样,只需切换以下值: void *temp; *temp = *a; *a = *b; *b = *temp; 也不正确,我不知道为什么。 因为在我看来,内容是切换的。 交换对象是否意味着完全交换内存和指针指向的值? 所以我似乎必须使用malloc为我的交换分配足够的空间。 如果我为一个对象分配足够的内存,假设它们的大小相同,我真的不知道它与上面的其他两种方法有什么不同。 void *temp = malloc(sizeof(pa)); // check for null pointer temp […]
所以我看到了一些关于如何找到架构的字节序的例子。 假设我们有一个指向int数据类型的整数指针。 让我们说int值是0x010A0B12。 在小端架构中,最低有效字节(即12)将存储在最低内存地址中,对吧? 因此,4字节整数中的最低字节为12。 现在,检查。 如果我们声明一个char指针p,并输入将整数指针转换为char *并将其存储在p中,并打印取消引用的p值,我们将得到一个关于该结构的字节顺序的线索。 如果它是12,我们就是小尾数; 01表示大端。 听起来真的很整洁…… int a = 0x010A0B12; int *i = &a; char *p = (char*)i; printf(“%d”,*p); // prints the decimal equivalent of 12h! 这里有几个问题,真的。 由于指针是强类型的,字符指针不应该严格指向char数据类型吗? 用%d打印的是什么? 难道我们不应该用%c打印字符吗?
我希望我没有错过类似的问题。 我正在尝试使用原始C函数编写自己的迷你shell。 我得到了一些应该可以工作的东西,但是我有一个指针可以解决所有问题。 我的adrCmd指针应该从searchCmd()函数获取命令路径字符串,并在main函数中保持相同的值。 实际上:它指向searchCmd()上的正确值,但不searchCmd() main() 。 这是代码: int searchCmd(char* cmd, char* adrCmd){ char* path = getenv(“PATH”); if(debug)printf(“PATH : %s\n”, path); int nbPath = (compteLettre(path, ‘:’)+1); char** pathTab = malloc(nbPath*sizeof(char*)); decompose(path, pathTab, 2048, ‘:’); int i; char* adr = malloc(sizeof(char*)); for(i=0; i<nbPath; i++){ sprintf(adr, "%s/%s", pathTab[i], cmd); if(debug)printf(" source : %s \n", adr); int fs […]
我正在开发一个项目,我在一个单独的函数内创建结构而不是main() 。 在创建并将成员(变量)信息添加到结构变量中之后,我需要能够return一个指向结构的指针,在该结构中我可以访问它以供参考和打印。 我包括我的代码,请尽可能简单,因为我是结构新手。 #include #include #include typedef struct _car { char color[20]; char model[20]; char brand[20]; int year; struct _car *eptr; } Car; Car* readCars(char* filename); /* * */ int main(int argc, char** argv) { Car *Cars; Car *eptr; Cars = readCars(argv[1]); printf(“%s%s%s%s”, Cars->color, Cars->brand, Cars->model, Cars->color); return (EXIT_SUCCESS); } Car* readCars(char* filename) { […]
我很清楚这个问题的丑陋,我还是想知道它是否可能: 当程序尝试读取/写入无效指针(NULL,未分配的块等)时,窗口会使应用程序崩溃并发生访问冲突exception。 问题是,有没有办法检查这个指针在尝试使用它之前会产生exception,否则,有没有办法捕获这个exception?
有很多像这样的代码: #include int main(void) { int a[2][2] = {{0, 1}, {2, -1}}; int *p = &a[0][0]; while (*p != -1) { printf(“%d\n”, *p); p++; } return 0; } 但基于这个答案 ,行为是不确定的。 N1570。 6.5.6 p8: 当一个具有整数类型的表达式被添加到指针或从指针中减去时,结果具有指针操作数的类型。 如果指针操作数指向数组对象的元素,并且数组足够大,则结果指向与原始元素偏移的元素,使得结果元素和原始数组元素的下标的差异等于整数表达式。 换句话说,如果表达式P指向数组对象的第i个元素,则表达式(P)+ N(等效地,N +(P))和(P)-N(其中N具有值n)指向分别为数组对象的第i + n和第i-n个元素,只要它们存在。 此外,如果表达式P指向数组对象的最后一个元素,则表达式(P)+1指向一个超过数组对象的最后一个元素,如果表达式Q指向一个超过数组对象的最后一个元素,表达式(Q)-1指向数组对象的最后一个元素。 如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义。 如果结果指向数组对象的最后一个元素之后,则不应将其用作已计算的一元*运算符的操作数。 有人可以详细解释一下吗?
以下C代码返回“分段错误”错误。 我不明白为什么它不返回值20.我的错误是什么? #include int main() { int* n; *n = 20; printf(“%i\n”,*n); return 0; }
我想知道数组如何在c中工作。 我最终得出一个假设,我想知道我是否正确。 我们知道数组是一系列相邻的内存盒(盒子),其中每个盒子的大小都是它所存储的类型(即如果INT的一个盒子的大小= sizeof(int),则一个3个INT的数组占用内存相邻的位置3 sizeof(int)) 现在我们也知道我们可以为某种类型的数组动态分配内存(C中的malloc,C ++中的new)。 让我想知道的是,当使用括号[0]调用数组时,一个数组的原点是数组的第一个框的地址和第一个值(后面的框中的值)是数组[0] = = *(数组+ 0)== *数组(数组是否被声明为“type * array”或“type array []”或“type array [size]”)和“数组”这样称为无论是定义为指针还是数组(“type * array”或“type array []”或“type array [size]”)是第一个框的地址。 我最后想了想,我想对此进行确认:数组甚至用方括号([]声明)实际上在内存中是一系列n个指针,每个指针包含(作为一个值而不是地址)的地址一个存储盒Bi,包含实际值+那些存储盒(B0,…,Bn,每个包含实际值)。 这样,当一个人声明“int array [5]”时,该程序实际上分配了5个相邻的int指针盒P0,P1,…,P4和5个整个计算机存储器B0,B1,…的整个大小的存储器位置。 ..,B4,其中Pi的值是Bi的地址 我是对还是错!! 谢谢!
此代码示例正确打印数组。 int b[2] = {1, 2}; int *c = &b; int i, j,k = 0; for (i = 0;i < 2; i++) { printf("%d ", *(c+i)); } 而这一个打印两个垃圾值。 int b[2] = {1, 2}; int i, j,k = 0; for (i = 0;i < 2; i++) { printf("%d ", *(&b+i)); } 为什么两个代码示例的行为不同?