Tag: 指针

堆栈和堆上的内存位置模式

如果堆栈上的变量(指针)的地址长度与堆之间存在任何关联,我只是好奇。 在很多情况下,我发现与堆相比,堆栈变量通常更长。 例如,考虑以下简单测试: #include #include int main(void) { int i = 0; int *j = malloc(sizeof(int)); *j = 0; printf(“&i = %p\nj = %p\n”, &i, j); free(j); return 0; } 输出: &i = 0x7fffe9c7fa5c j = 0x100e010 这些结果是在linux下使用gcc获得的; 这可能是OS /编译器依赖的吗?

#define ArrayLength(x)(sizeof(x)/ sizeof(*(x)))是什么意思?

这条线究竟意味着什么? 很清楚定义是什么,但我不明白为什么在分母处传递x的指针: #define ArrayLength(x) (sizeof(x)/sizeof(*(x))) 谢谢

更改const指针的值

我有以下代码: void TestFunc(const void * const Var1,const float Var2) { *(float *)Var1 = Var2; } 看起来我正在改变const指针指向的const对象的值(感谢sharptooth),这是不允许的。 事实是,我试过的编译器都没有发出警告。 这怎么可能?

如何获取C指针数组的长度?

可能重复: 函数参数中的数组长度 有没有像C can数组那样的Java can .length方法? 谢谢。

从C中的函数返回多维数组

从c中的函数返回多维数组的最佳方法是什么? 假设我们需要在函数中生成一个多维数组并在main中调用它,最好将它包装在一个结构中,还是只返回一个指向堆内存的指针? int *create_array(int rows, int columns){ int array[rows][columns] = {0}; return array; } int main(){ int row = 10; int columns = 2; create_array(row,columns); } 上面的代码,只是为了勾勒出我想到的基本程序。

int 和int *之间的区别作为函数参数

这是一个面试问题: int []和int*之间有什么区别,它们都是函数的输入参数。 f(int a[] , int* b) 我的回答: 对于f() ,它们具有相同的function。 第一个是a[]第一个元素的起始位置。 第二个指向一个int 。 但是,如何在不传递其他论据的情况下将它们彼此区分开来?

开发了一种替代方案

我开发了自己的strtok版本。 只是练习指针的使用。 任何人都可以看到任何限制,或者无论如何我可以改进。 void stvstrtok(const char *source, char *dest, const char token) { /* Search for the token. */ int i = 0; while(*source) { *dest++ = *source++; if(*source == token) { source++; } } *dest++ = ‘\0’; } int main(void) { char *long_name = “dog,sat ,on ,the,rug,in ,front,of,the,fire”; char buffer[sizeof(long_name)/sizeof(*long_name)]; stvstrtok(long_name, buffer, ‘,’); printf(“buffer: […]

float *从C到C#

我不是一个真正的CS人,所以如果你们这里的天才能指出我正确的方向,我将永远感激。 我有一个c-code命令行函数,用于将其结果写入文件。 我将其转换为通过float *数组将其数据返回到类似的C ++程序(以避免常量文件I / O): float * mgrib(int argc, char **argv) 这非常有效。 我现在需要把它变成一个C#程序,这就是事情变得混乱的地方。 我做的第一件事就是避免使用char **来使争论成为一系列bool。 如果我允许它仍然转储到文件,这工作正常。 问题是在C#中使用c风格的float数组。 在c-code中,它被分配了malloc。 所以这是我尝试过的一切都没有成功(我知道数组的大小): 制作一个“免费”函数,以便在完成后从C#调用以释放内存。 经过几次循环后,C#崩溃,没有任何警告。 使用Marshal.FreeCoTaskMem从C#释放malloc。 结果相同。 将float *移动到参数并删除c代码malloc。 (void mgrib(…,float * data,…) __a)使用Marshal.AllocCoTaskMem分配它。 使用Marshal.FreeCoTaskMem释放它。 __b)使用Marshal.Copy进行分配。 使用Marshal.FreeCoTaskMem释放它(也许这是错的?) 我已经涉足了我能在网上找到的所有东西。 如果需要更多信息,请告诉我。 我希望这只是一个我想念的简单概念。

指向结构数组和获取内存的指针

link是指向节点的指针 typedef struct node * link; 在main()中,我有以下代码(config-> m只是一些整数): // array of pointers to structs link heads[config->m]; // make memory for head nodes for(i = 0; i m; i++) heads[i] = malloc(sizeof(struct node)); 代码有效(很棒)。 但有没有办法可以在没有循环的情况下分配config->m块内存? 我试过了 link heads[config->m]; heads = malloc(sizeof(struct node) * config->m); 但我友好的邻居编译器告诉我incompatible types in assignment 我知道我可以用 struct node heads[config->m]; 但我想用指针来做这些事情。 和往常一样,有人会问我这是否是家庭作业的一部分,答案是肯定的(有点)。 但是这个特殊的代码块与实际的赋值没有任何关系; 这是我自己的启蒙。 […]

在C中,NULL指针和指向0的指针之间有区别吗? 如果是这样,什么?

在C中,NULL指针和指向0的指针有什么区别?