Tag: 数组

我应该如何malloc / realloc与包含数组的结构?

我对c很新,所以如果我的步骤有误,请告诉我。 假设我有以下内容: struct graphNode{ int val; graphNode* parent; int succSize; int succMaxSize; graphNode* succ[1]; }; 我将创建一个新节点: graphNode *n; n = malloc(sizeof(struct graphNode)); assert(n); n->val = 1; n->parent = NULL; n->succSize = 0; n->succMaxSize = 1; 然后,如果我想向节点添加后继 if (n->succSize == n->succMaxSize){ n->succ = realloc(n->succ, sizeof(graphNode*) * n->succMaxSize * 2); n->succMaxSize *= 2; } n->succ[succSize] = n2; […]

将元素插入到数组C中

我有一个已经排序过的数字数组,所以不需要对它进行排序,我需要在数组中的有效位置插入一个给定的值,命名为val 。 我的程序适用于小于最后一个值的给定值,但对于值大于最后一个的情况,我的程序只是不想插入值。 例如,对于数组{1, 2, 3, 4, 6}和值5 ,数组应为{1, 2, 3, 4, 5, 6} ,但对于值7我的数组看起来像{1, 2, 7, 4, 6, 0} 。 #include void insert(int val, int *n, int v[]) { int index; index = n – 1; if (n == 0) { v[0] = val; // check if array is empty n = n + […]

在C中返回int数组

我有这个代码: 1 #include 2 #include 3 #define LENGTH(a) sizeof(a)/sizeof(a[0]); 4 5 int *getNbits(int, int, char *); 6 7 int main() { 8 char ins[] = “00001111000011110000111100001111”; 9 int *x = getNbits(0, 32, ins); 10 11 for (int i = 0; i < LENGTH(x) ; i++){ 12 13 printf("%d", *(x + i)); 14 } 15 return […]

使用mmap共享结构数组

我正在尝试创建父进程和子进程之间共享的结构数组。 我试图访问arrays数据时遇到分段错误。 我确信这个问题与我使用指针的方式有关,因为这是一个我不太满意的领域。 请注意,我删除了大部分似乎不相关的代码。 /* structure of Registration Table */ struct registrationTable{ int port; char name[MAXNAME]; int req_no; }; main() { /* the registrationTable is to be a shared memory space with each child process able to access and update. No concurrency controls are implemented. The parent process is responsible for cleaning up after the […]

如何将元素从字符串数组传递给线程?

需要一些帮助来解决“将元素从字符串数组传递给线程”的问题。 我的代码是在这个文本之后。 我在main函数中声明了一个字符串数组,然后将一个数组元素传递给一个线程。 在线程中我将它转换回char *类型然后打印,但它打印垃圾值。 将不胜感激解决方案: #include #include void *agent(void *); int main(int argc, char *argv[]) { int i; pthread_t agent_t[3]; char *agent_colour[3] = {“Red”,”White”,”Brown”}; for(i = 0 ; i <= 2 ; i++) { pthread_create(&agent_t[i], 0, agent, &agent_colour[i]); } for(i = 0 ; i <= 2 ; i++) { pthread_join(agent_t[i], NULL); } return 0; […]

如何释放一个char指针数组?

我使用此方法将列表中的值转换为数组,以便在execvp()中使用 – 系统调用: char **list2argarray(struct shellvalue *values, int count) { char **array = (char **)malloc((count + 1) * sizeof(char *)); int i = 0; while (values) { char *word = values->word; array[i] = (char *)malloc(sizeof(word) + 1); strcpy(array[i], word); values = values->next; i++; } array[i] = NULL; return array; } 什么是释放这些数组的正确方法? 我试过像这样的东西 void freeargpointer(char **array, […]

数组指针算法 – 合法和未定义的行为

我问自己这些代码行是否会在C和C ++中产生未定义的行为。 我试着回答每一点,阅读标准关于数组下标的内容(C 6.5.6 – 8)。 我没有发布整个段落,因为它很长。 此外,如果表达式P指向数组对象的最后一个元素,则表达式(P)+1指向一个超过数组对象的最后一个元素,如果表达式Q指向一个超过数组对象的最后一个元素,表达式(Q)-1指向数组对象的最后一个元素。 如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义。 如果结果指向一个超过array> object的最后一个元素的结果,则它不应该用作被计算的一元*运算符的操作数。 1 int a[10]; 2 int b = a[9]; // ok 3 int c = a[10]; // UB 4 int* d = (a + 10); // ok 5 int* e = &a[10]; // ok from C99 (& and [] are ignored, pointer is not […]

在函数中初始化数组

当我想通过函数初始化指向数组的指针时,我正在执行以下操作: 通过函数初始化和销毁​​数组: int initArr(int **b) { int *arr = (int *) malloc(sizeof(int)*2); if(arr == NULL) return 0; *b = arr; arr = NULL; return 1; } void destroyArr(int *b) { free(b); b = NULL; } 初始化指向数组的指针: int *pArr; int initStatus = initArr(&pArr); if(initStatus == 0) { printf(“%s”, “error”); return 0; } 使用指向数组的指针: *pArr = 1; […]

可变长度arrays性能影响(C / C ++)

我正在编写一个相当简单的函数,将数组发送到文件描述符。 但是,为了发送数据,我需要附加一个字节的头。 这是我正在做的简化版本,它似乎工作: void SendData(uint8_t* buffer, size_t length) { uint8_t buffer_to_send[length + 1]; buffer_to_send[0] = MY_SPECIAL_BYTE; memcpy(buffer_to_send + 1, buffer, length); // more code to send the buffer_to_send goes here… } 就像我说的,代码似乎工作得很好,但是,我最近养成了使用Google C ++风格指南的习惯,因为我目前的项目没有设置样式指南(我实际上是我唯一的软件工程师)项目,我想使用在工业中使用的东西)。 我运行了Google的cpplint.py,它抓住了我创建buffer_to_send的行,并抛出了一些关于不使用可变长度数组的注释。 具体来说,这就是Google的C ++风格指南对变长数组的看法…… http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Variable-Length_Arrays_and_alloca__ 基于他们的评论,似乎我可能已经找到了我的代码中看似随机崩溃的根本原因(这种情况很少发生,但仍然很烦人)。 但是,我对如何修复它有点不知所措。 以下是我提出的解决方案: 使buffer_to_send基本上是一个恒定长度的固定长度数组。 我能想到的问题是,我必须使缓冲区与我想要发送的理论上最大的缓冲区一样大。 在一般情况下,缓冲区要小得多,而且每次调用函数时都会浪费大约0.5KB。 请注意,程序必须在嵌入式系统上运行,虽然我不一定要计算每个字节,但我希望尽可能少地使用内存。 使用new和delete或malloc / free来动态分配缓冲区。 这里的问题是频繁调用该函数,并且在不断向操作系统询问内存然后释放它时会有一些开销。 使用两次连续的write()调用,以便将数据传递给文件描述符。 也就是说,第一次写入只传递一个字节,而下一次写入将发送剩余的缓冲区。 虽然看起来很简单,但我需要对代码进行更多的研究(请注意,我从之前离开我工作的公司的工程师处获得了此代码),以保证两次连续写入以primefaces方式发生。 此外,如果这需要锁定,那么它实际上变得更复杂并且比情况#2具有更多的性能影响。 请注意,我不能使buffer_to_send成为成员变量或将其作用于函数外部,因为在任何给定时间(可能)从各种线程调用该函数。 请让我知道您的意见以及我的首选方法。 […]

C将未知大小的数组传递给单个变量中的函数

在C中,我必须将数组传递给单个变量中的函数,并且在程序运行之前不知道数组的大小。 纸上解决方案是在数组中有一个额外的元素,你将存储数组的大小(我认为这称为“哨兵值”)。 好的,但我在实现这个问题时遇到了问题。 将array []作为函数参数传递似乎不起作用。 我想我可以发送指向第一个元素的指针,但是如何访问数组的其余部分呢?