Tag: 指针

复合/字符串文字在哪里存储在内存中?

我看了; 复合文字是C99function,可用于创建没有名称的数组。 考虑这个例子: int *p = (int []){3, 0, 3, 4, 1}; p指向包含3, 0, 3, 4和1个的五元素数组的第一个元素。 其实我想知道,这个数组是否会存储在内存中,因为它没有名字? 换言之,如果是 char* str = “hello” 字符串”hello”将存储在内存中?

C:指向结构指针数组的指针(分配/释放问题)

我已经回到了C的某些东西,但是我很难记住这个内存管理的工作原理。 我想要一个指向结构指针数组的指针。 说我有: struct Test { int data; }; 那么数组: struct Test **array1; 它是否正确? 我的问题是处理这件事。 因此,数组中的每个指针都指向单独分配的内容。 但我认为我需要先做到这一点: array1 = malloc(MAX * sizeof(struct Test *)); 我无法理解上述内容。 我需要这样做,为什么我需要这样做? 特别是,如果我要为指针指向的每个东西分配内存,为指针分配内存意味着什么? 现在说我有一个指向结构指针数组的指针。 我现在希望它指向我之前创建的相同数组。 struct Test **array2; 我是否需要像上面那样为指针分配空间,或者我可以这样做: array2 = array1

在C中的malloc,但使用多维数组语法

有没有什么方法可以malloc一个大型数组,但用2D语法引用它? 我想要的东西: int *memory = (int *)malloc(sizeof(int)*400*200); int MAGICVAR = …; MAGICVAR[20][10] = 3; //sets the (200*20 + 10)th element 更新:这一点很重要:我只想拥有一个连续的内存块。 我只是不想写一个像: #define INDX(a,b) (a*200+b); 然后参考我的blob: memory[INDX(a,b)]; 我更喜欢: memory[a][b]; 更新:我理解编译器无法按原样知道。 我愿意提供额外的信息,例如: int *MAGICVAR[][200] = memory; 没有这样的语法吗? 请注意我不仅使用固定宽度数组的原因是它太大而无法放在堆栈上。 更新:伙计们,我可以这样做: void toldyou(char MAGICVAR[][286][5]) { //use MAGICVAR } //from another function: char *memory = (char *)malloc(sizeof(char)*1820*286*5); fool(memory); 我收到一个警告, […]

释放一个双指针

我使用双指针创建了一个二维矩阵: int** pt; pt = (int*) malloc(sizeof(int)*10); 我知道指针被释放了 free(ptr); 我们如何释放双指针? 如果我们打印一些内容然后释放内存并退出程序怎么办? 最终记忆是否包含我们使用的记忆或与初始记忆相同?

传递可变大小的多维数组

我试图理解将多维数组传递给c中的函数的“最佳实践”(或实际上是任何实践)是什么。 当然这取决于应用程序,因此我们考虑编写一个函数来打印可变大小的2D数组。 特别是,我对如何在下面的代码中编写函数printArry(__, int a, int b)感兴趣。 我省略了第一个参数,因为我不确定应该是什么。 void printArry(_____, int a, int b){ /* what goes here? */ } int main(int argc, char** argv){ int a1=5; int b1=6; int a2=7; int a2=8; int arry1[a1][b1]; int arry2[a2][b2]; /* set values in arrays */ printArry(arry1, a1, b1); printArry(arry2, a2, b2); }

什么是近,远和巨大的指针?

任何人都可以用适当的例子向我解释这些指针……当这些指针被使用时?

为什么我们不能将新字符串分配给数组,而是分配给指针

我试图将一个字符串重新分配给预先初始化的数组a [],而我所能得到的只是一个错误 main() { char a[] = “Sunstroke”; char *b = “Coldwave”; a = “Coldwave”; b = “Sunstroke”; printf(“\n %s %s”,a,b); } [错误]:从类型’char *’分配类型’char [10]’时不兼容的类型..我搜索了这个但是找不到任何原因..我也尝试通过重新声明重新分配它 char a[] = “Sunstroke”; 但它没有奏效…… 但是在指针的情况下,有可能像上面的程序..

为什么我可以更改const char *变量的值?

为什么C中的以下代码有效? const char* str = NULL; str = “test”; str = “test2”; 由于str是指向常量字符的指针,为什么我们允许为它分配不同的字符串文字? 此外,我们如何保护str不被修改? 例如,如果我们稍后将str分配给更长的字符串,最后写入另一部分内存,那么这似乎是一个问题。 我应该补充一点,在我的测试中,我在每个作业之前和之后打印出str的内存地址,但它从未改变过。 因此,尽管str是指向const char的指针,但内存实际上正在被修改。 我想知道这可能是C的遗留问题吗?

指针的大小是多少? 它究竟依赖于什么?

我在网上搜索,虽然我可以找到一些讨论,但我没有找到全面的描述。 因此,如果任何人都可以形成一个涵盖指针大小的答案,那将会有很大的帮助。 答案至少应包括以下主题 指针的大小取决于什么? 架构的哪些特性会影响指针的大小? (详细地) 编译器如何影响指针的大小?

传递地址,但它的工作方式类似于C中的值?

您好,我是C编程语言的初学者。 最近我读到了关于价值的呼叫和地址呼叫。 我已经了解到,在通过地址调用时,被调用函数的变化反映了被调用者。 但是,以下代码不起作用。 int x = 10,y = 20; void change_by_add(int *ptr) { ptr = &y; printf(“\n Inside change_by_add\t %d”,*ptr); // here *ptr is printing 20 } void main(){ int *p; p = &x; change_by_add(p); printf(“\nInside main\t %d”, *p); // here *p is still pointing to address of x and printing 10 } 当我传递地址时,为什么被调用函数所做的更改不会反映调用者?