我对C中指针的使用有一些困惑/问题。我已经把下面的示例代码轻松地理解了。 请注意这些代码的不同之处。 如果您对它有一些问题,请收到反馈。 这不起作用。 #include #include void process() { int *arr; arr=(int*)malloc(5*sizeof(int)); arr=(int*){3,1,4,5,2}; for(int z=0;z<5;z++) { printf("%d ",arr[z]); } printf("\n"); } int main() { process(); return 0; } 但这很有效。 #include #include void process() { int *arr; arr=(int*)malloc(5*sizeof(int)); arr=(int[]){3,1,4,5,2}; for(int z=0;z<5;z++) { printf("%d ",arr[z]); } printf("\n"); } int main() { process(); return 0; } 这也有效。 为什么? […]
正如我所看到的那样int *x[n][m]声明x是一个指向整数的2-d指针数组,因此分配内存应该像x[i][j] = new int一样容易,并且正如预期的那样精细。 现在,如果我将声明更改为: int (*x)[n][m] x[i][j] = new int不再有效并导致编译错误。 x = (int(*)[n][m]) malloc (sizeof(int[n][m]))然而编译。 从我运行的几个测试开始,在内存分配之后,不同的声明/分配组合似乎不会影响存储在变量中的值。 我错过了什么吗? 所以我的问题是, int * x [n] [m]和int(* x)[m] [n]之间是否存在差异。 int(* x)[n] [m]如何存储在内存中?
我有一个通用链接列表,其中包含void *类型的数据我试图用类型struct employee填充我的列表,最终我想破坏对象struct employee。 考虑这个通用的链表头文件(我用char *类型测试过它): struct accListNode //the nodes of a linked-list for any data type { void *data; //generic pointer to any data type struct accListNode *next; //the next node in the list }; struct accList //a linked-list consisting of accListNodes { struct accListNode *head; struct accListNode *tail; int size; }; void accList_allocate(struct […]
我正在使用gcc版本4.8.0和标志-Wall -std=gnu99 。 我需要在C中使用malloc为连续的2D数组动态分配内存; 这个事实是不可谈判的。 但是,为了便于使用,我仍然希望能够使用方便的x[r][c]表示法访问数组。 这是我勇敢尝试创建指向连续2D数组的指针并通过执行*array[r][c]索引数组: #include #include int main(void) { size_t rows = 3, cols = 5; printf(“sizeof(int) = %li\n\n”, sizeof(int)); int (*array)[rows][cols] = malloc(sizeof(int) * rows * cols); printf(“array starts at %p\n”, array); printf(“sizeof(array) = %li\n”, sizeof(array)); printf(“sizeof(array[0][0]) = 0x%lx\n”, sizeof(array[0][0])); puts(“”); unsigned short r, c; for (r = 0; r <= […]
对不起,另一个C指针问题..我有一个函数func()对数组进行排序,然后得到最大和最小的整数。 我试图将它们放在main()中的指针变量中,但这些值只在func()函数内部正确。 我不明白为什么:( #include void func(int arr[], int *s, int *l, int n){ int i = 1; for(; i 0 && arr[n-1] > temp){ arr[n] = arr[n-1]; n–; } arr[n] = temp; } l = &arr[n-1]; s = &arr[0];\ printf(“%d %d\n”,*l,*s); } int main(void){ int arr[] = {1,2,9,3,58,21,4}; int *s, *l; int size = 7; […]
我内存优化了我用于嵌入式使用的代码。 它运行良好,但结果是我获得了大量的1D,2D和3D mallocs,并在函数中间释放,从而减慢了执行时间。 出于几个原因,我决定修改我的方式。 我想在执行开始时用一个malloc分配所有可用的内存,并指出每个数组需要的正确内存空间。 有关信息,我现在在x86上执行此操作,所以我没有任何内存空间问题。 我用这种方式声明我的数组: unsigned char *memory; memory = (unsigned char *)malloc(MYSIZE*sizeof(unsigned char)); type* p1; p1 = (type *)((int)memory + p1_offset); type** p2; p2 = (type **)((int)memory + p2_offset); for (int i=0 ; i<p2_height ; i++) { p2[i] = (type *)((int)p2 + p2_width*sizeof(type)); } 虽然它适用于我的1D指针,但它为我的2D指针声明返回了一个段错误。 我检查了我的偏移量,它们与内存指针相比很好。 由于我没有经验这种方式来宣布我的指针,也许我在这里误解了一些东西,所以如果有人可以向我解释更多关于这种技术的话,我会很高兴!
我有一个结构tcp_option_t ,它是N个字节。 如果我有一个指针tcp_option_t* opt ,并且我希望它增加1,我就不能使用opt++或++opt因为这将增加sizeof(tcp_option_t) ,即N 我想将此指针仅移动1个字节。 我目前的解决方案是 opt = (tcp_option_t *)((char*)opt+1); 但它有点麻烦。 有没有更好的方法?
我有一个程序可以接受命令行参数,我想从一个函数访问用户输入的参数。 如何将*argv[]从int main( int argc, char *argv[])传递给该函数? 我对指针的概念有点新意见, *argv[]看起来有点过于复杂,我无法自己解决这个问题。 我的想法是通过将我想要对参数做的所有工作移动到库文件来尽可能保持我的main干净。 当我设法在main之外掌握它们时,我已经知道我必须对这些论点做些什么。 我只是不知道如何让他们在那里。 我正在使用GCC。 提前致谢。
最近的一个问题促成了以数组和指针为中心的讨论。 问题是参考scanf(“%s”, &name) vs scanf(“%s”, name) 。 对于以下代码,Microsoft实际上在VS2010(也许是早期版本?)中为您解决了这个问题, #include int main() { char name[30]; printf(“Scan \”name\” – “); scanf(“%s”, name); printf(“Print \”&name\” – %s\n”, &name); printf(“Print \”name\” – %s\n”, name); printf(“Pointer to &name – %p\n”, &name); printf(“Pointer to name – %p\n”, name); printf(“\n\n”); printf(“Scan \”&name\” – “); scanf(“%s”, &name); printf(“Print \”&name\” – %s\n”, &name); printf(“Print […]
我是C.的新手 我知道这有多种forms的问题,但我的有点独特……我想。 我有一个无符号的短指针。 6 unsigned short *pt; 7 pt = myArray[0]; 数组声明如下: const unsigned short myArray[1024]并且是一个hex数的数组,forms为0x0000,依此类推。 我尝试编译,它抛出这些错误: myLib.c:7: error: data definition has no type or storage class myLib.c:7: error: type defaults to ‘int’ in declaration of ‘pt’ myLib.c:7: error: conflicting types for ‘pt’ myLib.c:6: note: previous declaration of ‘pt’ was here myLib.c:7: error: initialization makes […]