我正在读一本关于数据结构的书,并且难以掌握指针的概念。 让我先说一下我对C没有很多经验。但是这里…… 如果我执行以下操作: int num = 5; int *ptrNum; ptrNum = # 我的理解是指针为32位int保留了足够的内存以及实际指针所需的内存,尽管它的值只是变量的内存地址。 如果保留相同数量的内存,这样做的目的是什么? 为什么我会使用指针而不是变量num? 我完全不在这里吗?
假设我有以下声明: int* volatile x; 我相信这定义了一个易失性指针“正常”变量。 对我来说,这可能意味着两件事之一: 首先猜猜 指针可以更改,但数字不会更改,恕不另行通知。 这意味着一些其他线程(编译器不知道)可以更改指针,但如果旧指针指向“12”则新指针(指针的新值,因为线程更改它) )会指向另一个“12”。 对我来说这似乎没用,我认为这不是真正的操作。 第二个猜猜 指针可以更改,因此如果指针发生更改,编译器必须在使用之前重新加载指针中的值。 但是如果它确认指针没有改变(带有附加检查),那么它可以假设它指向的值也保持不变。 所以我的问题是: 声明指向非易失性数据的易失性指针实际上做了什么?
祝大家好日子, 我对C编程很陌生,我偶然发现了一个问题,试图在几天内正确地解决,但仍然没有令人满意的结果。 我试图从这个forms的输入中提取一些double值{[ 5.1 ; 4 ], [15.3 ; -3.2] } {[ 5.1 ; 4 ], [15.3 ; -3.2] } {[ 5.1 ; 4 ], [15.3 ; -3.2] } 。 我尝试了很多方法,到目前为止最好的方法是我使用fgets()读取用户输入作为字符串,使用for循环,如果isdigit()看到一个数字我将它存储在另一个字符串中,然后我检查是否有在数字后面点,如果有,那么我把它放在数字后面的字符串,依此类推。 真正的问题是,当我想输出结果字符串并使用strtod()将其转换为我想要的double ,它只有在用户首先输入一些数字时才有效,但是如果输入看起来像{ [ 2.5 ; 1 ] } { [ 2.5 ; 1 ] }代码只是不关心,什么都不做。 任何帮助或见解将不胜感激,也许我采取了错误的方法? 谢谢。 我的代码 #include #include #include #include #include #define […]
作为这篇文章的扩展,我已经派生出了具有成员派生类型的类型。 示例如下: module simple use iso_c_binding TYPE SIMPLEF INTEGER :: A INTEGER, POINTER :: B, C(:) END TYPE SIMPLEF TYPE COMPLEXF INTEGER :: X TYPE (SIMPLEF) :: Y END TYPE COMPLEXF end module simple 如上文所述,目标是在C中具有类似的派生类型,并且能够将值来回传递给Fortran。 解决方案可以在这里看到。 然而,这里它不仅仅是一个派生类型,它是一个派生类型,其成员本身就是派生类型。 我是否需要为每个Y成员创建COMPLEXF子程序,即SETY_A,QUERYY_A,SETY_B,QUERYY_BSIZE,SQUERYY_B等? 或者有更好的方法来解决这个问题吗?
我试图理解C中malloc和sbrk之间的区别以及它们之间的关系。 根据我的理解,malloc和sbrk几乎是一回事,但我读到malloc使用sbrk来分配内存。 如果有人向我解释,这真的令人困惑吗? 例如在这个程序中malloc调用sbrk吗? 如果是这样,它每次调用时都会调用sbrk,所以对于这个例子10次? int main(int argc, char **argv) { int i; void *start_pos, *finish_pos; void *res[10]; start_pos = sbrk(0); for (i = 0; i < 10; i++) { res[i] = malloc(10); } finish_pos = sbrk(0); return 0; } 谢谢,
我花了几天时间试图理解指针,但语法仍然让我感到困惑。 写的时候说, int *ptr; ,这个声明之后ptr和*ptr什么区别? 在K&R中,他们从这个例子开始关于指针的章节: int x = 1, y = 2, z[10]; int *ip; /* ip is a pointer to int */ ip = &x; /* ip now points to x */ y = *ip; /* y is now 1 */ *ip = 0; /* x is now 0 */ ip = &z[0]; […]
我有以下代码: #include int main(void) { char *buffer = NULL, **words = NULL, *aPtr = NULL, *sPtr; int count = 0; buffer = strdup(“The quick brown fox jumps over the lazy dog”); sPtr = buffer; do { aPtr = strsep(&sPtr, ” “); words[count++] = … // missing code } while(aPtr); return 0; } 你可以在上面看到我错过了一些代码……是否有任何类型的strdup()适用于这种情况? strdup()函数本身似乎不起作用……如果没有,我怎样才能使这段代码工作? 指针指针对我来说很头疼……
在这种情况下,我遇到了一些问题,请问你的想法。 main() { char *p=NULL; p=(char *)malloc(2000 * sizeof(char)); printf(“size of p = %d\n”,sizeof (p)); } 在这个程序中它打印4个(char *)值,但我需要分配多少字节。
我目前正在研究NUMA机器。 我正在使用numa_free来释放我分配的内存。 但是,与free不同, numa_free需要知道要释放多少字节。 有没有办法知道指针指向多少字节而不追踪它?
这是一种初始化指针的不常见方式: int *p = (int[10]){[1]=1}; 这里,指针指向复合文字。 #include int main(void) { int *p = (int[10]){[1]=1}; printf(“%d\n”, p[1]); } 输出: 1 该程序在G ++编译器中编译并运行良好。 所以, 这是初始化复合文字指针的正确方法吗? 要么 它是未定义的行为初始化指向复合文字的指针吗?