Tag: 指针

C:地址运算符(&)是否产生指针(地址+类型)或地址?

我读到的关于地址运算符的大部分内容都用来表示它 – 一个地址。 我最近听到它的描述不同,因为它产生了一个完整的指针。 鉴于以下C代码, int i1 = 5; int *p1; p = &i1; 我的理解是p1通过存储i1的数据存储的地址来引用int 5 ,并记住该位置的数据将被解释为int (它指示要读取的字节数和如何解释读取数据)。 地址运算符是否同时产生地址和“类型感知”,或者类型感知是否隐含,因为p1被声明为int指针? 让我对此感到疑惑的一件事就是看到如下代码: void myFunc(int *ptr); int i = 5; myFunc(&i);

2D char数组和char **(OR,3D char数组和char ***等)之间的区别

首先,我已经审查了这些: 多维数组如何在内存中格式化? C中二维数组的内存映射 从那里,已知2D数组与 char **不同,但在内存中它们看起来完全相同 。 这听起来很奇怪,所以我研究了以下内容: #include char func(char** m) { return m[0][0]; //only works for char**, already discussed in the other SO question } int main() { //char a[4][2]; //a 2D char array int row = 4, col = 2; //char** char** a = malloc(row * sizeof(char*)); int i; for (i = […]

交换两个指针交换数组

我有以下代码,我想让它使板现在具有new_board的值,反之亦然。 由于它们都是指针我以为我可以交换它们指向的地址。 当我在print2()中打印时,地址被适当地交换。 但是,当我在print1()中打印时,地址以某种方式换回,这对我没有任何意义。 此外,如果我在print2()中打印出电路板中的值,它们也是正确的。 main(){ char *new_board = (char *)malloc(sizeof(char) * rows * cols ); char *board = (char *)malloc(sizeof(char) * rows * cols ); update_board2(board, new_board, rows, cols); print1(); } void update_board2(char *board, char *new_board, int rows, int cols){ //do a bunch of stuff char *temp = board; board = new_board; new_board = […]

使用strcpy时出现分段错误?

我试图通过传递在编译时定义路径: -DDCROOTDEF='”/path/to/stuff”‘ 在编译行上。 然后我尝试在代码中使用它,如: char * ptr_path; strcpy(ptr_path, DCROOTDEF); strcat(ptr_path,”/MainCommons/CommonLib/fonts/Arial.ttf”); char *pftf=ptr_path; gdImageStringFT(pimg,brect,iclr,pftf,pts,ang,ixp,iyp, (char *)cbuf); 这给了我一个分段错误。 但是,如果我尝试先打印字符串: char * ptr_path; strcpy(ptr_path, DCROOTDEF); strcat(ptr_path,”/MainCommons/CommonLib/fonts/Arial.ttf”); char *pftf=ptr_path; printf(“%s\n”,pftf); gdImageStringFT(pimg,brect,iclr,pftf,pts,ang,ixp,iyp, (char *)cbuf); 它工作得很好。 我错过了char指针的复杂性吗? 谢谢

如何在C中正确释放char **

我真的对这个2D char数组感到困惑 char **arg = malloc(sizeof(char*) * argc) for (int i = 0; i < argc; i++) arg[i] = malloc(sizeof(char) * size) … … 现在假设经过一系列操作后,我忘记了变量argc,我怎样才能释放那些内存? 我可以这样做吗? 这在任何情况下都绝对正确吗? char **tmp = arg; while (*tmp != NULL){ free(*tmp); tmp++; } free(arg);

C会自动释放没有指针的内存吗?

假设我们单独运行这段代码: malloc(1024); 这会导致内存泄漏,还是C会自动知道释放没有引用的指针? 换句话说,我可以避免将其分配给指针吗? void *p = malloc(1024); free(p);

在C.中,数组的名称是指向它的第一个元素的指针,不是吗?

在下面的示例代码中,我使用string作为数组,如果str的名称是指向str的第一个元素的指针,在这种情况下,字符串的第一个字符,即s,str的大小,应该是8,但它给了6而不是。 #include char str[] = “string”; char *ptr = “string”; int main(void){ int first = sizeof(str); int second = sizeof(str[0]); int third = sizeof(ptr); int size_of_array = sizeof(str)/sizeof(str[0]); printf(“the size is %d, %d, %d, %d”, size_of_array, first, second, third); return 0; } 看起来str不是指针,str的大小不是ptr的大小? 我很困惑

如何在C中清除此数组指针?

我正在尝试使用系统调用进行基本的bash,但是我对指针数组有一些小问题。 为了恢复我的代码,我从stdin中读取带有read()的命令到缓冲区然后我使用strsep()将命令与参数和所有参数分离到一个数组中。 然后我用fork()创建一个新进程,并使用execvp()的相关参数执行该命令。 所有这一切都进入无限循环,直到用户键入“退出”(尚未编码)。 问题是在第一次迭代之后,我需要* pArgs为空,用于下一个命令和参数。 我不知道怎么做…… 这是我的代码: #include #include #include #include int main(int argc, char **argv) { char bBuffer[BUFSIZ], *pArgs[10], *aPtr = NULL, *sPtr; int aCount; pid_t pid; while(1) { write(1, “\e[1;31mmyBash \e[1;32m# \e[0m”, 27); read(0, bBuffer, BUFSIZ); sPtr = bBuffer; aCount = 0; do { aPtr = strsep(&sPtr, ” “); pArgs[aCount++] = aPtr; […]

我可以使用指针打印出int数组的数组,就像字符串数组一样吗?

如果我想打印出如下字符串数组: char juices_A[][12] = { “dragonfruit”, “waterberry”, “sharonfruit”, }; 我可以简单地分别使用juices_A[0] , juices_A[1] , juices_A[3]作为指向字符串”dragonfruit” , “waterberry” , “sharonfruit”的指针,然后打印出来。 但是,如果我想打印出int数组的数组,如果: int data[3][3] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; 我不能简单地使用data[0] , data[1] , data[2]作为指向{ 1, 2, 3 } , { 4, 5, 6 } , […]

在C中调用fork()之后引用指针

所以,我有一个函数,用一些字符串数据加载一个char **变量。 我的目标是分叉进程,并在子进程中打印一些数据,并从父进程中打印一些数据。 但是,我在fork()调用后无法引用指针。 我认为fork()制作了父进程的整个地址空间的副本,似乎它将包含各种堆栈指针…… 基本上,我的代码目前看起来像这样: load_data(char **data); char** data; load_data(data); printf(“String 0: %s\n”, data[0]); fork(); printf(“String 0 again: %s\n”, data[0]); /* Segfaults Here! */ 任何人都有任何想法,我做错了什么? 我已经做了一些谷歌搜索,这似乎我正在做的应该工作 – 但它没有。 因此,我误解了一些基本的东西……