Tag: 指针

指针和数组 – 艰难地学习C语言

这个问题来自Zed Shaw的Learn C the Hard Way。 它是关于指针和数组的。 我们在这里给出了一些代码: #include int main(int argc, char *argv[]) { // create two arrays we care about int ages[] = {23, 43, 12, 89, 2}; char *names[] = { “Alan”, “Frank”, “Mary”, “John”, “Lisa” }; // safely get the size of ages int count = sizeof(ages) / sizeof(int); int i […]

指针数组并动态分配字符串的内存

这个问题与这个问题有关 。 我正在定义一个150b的字符数组,并将字符串复制到它: const gchar *strAuth; gchar *strings[18][150]; strcpy(strings[0],strAuth); 这对于大多数情况来说是巨大的内存浪费,对于某些极端情况可能不够。 正如所引用的问题所建议的那样,“创建一个指针数组并动态地为字符串分配内存”是一个更好的主意。 我怎么能做到这一点? 请帮助。

如何在c中使用双哈希进行搜索

我有一台服务器来接收来自多个客户端的请求。 我用线程完成了这个。 我想在哈希表中插入一些用户名和密码。 为此,我使用双哈希方法。 它已成功插入。 但是我想知道当用户输入用户名时,我需要在哈希表上搜索该用户名是否已经存在。 但我现在不能这样做。 我知道使用散列的概​​念。 使用hashfunction1通过用户名获取索引并使用像这样的双哈希。 但是我该如何编写该代码呢? 我的代码: int HashFunc1 (char *key,int size) { int i = 0,value = 0; for(i = 0 ; key[i] != ‘\0’; i++) { value += ( key[i] + ( i + 1 ) ); } return value % size; } int HashFunc2 (char *key,int size) { […]

‘sizeof’无效应用于不完整类型’int ‘访问指针指向的整数数组时

我正在尝试学习C中的指针并且正在编写这个小整数数组指针练习,但是遇到了一个无效的sizeof应用程序到不完整类型的int[]问题。 请告诉我哪里出错了以及如何解决。 谢谢。 #include int intA[] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; int intB[]; void int_copy(const int *source, int *destionation, int nbr) { int i; for(i=0;i<nbr;i++) { *destionation++ = *source++; } } int main() { int *ptrA = intA; int *ptrB = intB; int sizeA = sizeof(intA); int nbrA = sizeof(intA)/sizeof(int); […]

将&var传递给* var和var传递给var有什么区别?

基本上,我想知道为什么这个(将list的内存地址作为参数传递): void init_lista (elemPtr *list) { *list = NULL; } int main(){ elemPtr list; init_list(&list); //[…] } 与此不同(仅传递列表的内容): void init_lista (elemPtr list) { list = NULL; } int main(){ elemPtr list; init_list(list); //[…] } OBS: elemPtr是结构的指针类型( typedef struct elem *elemPtr )。 我从&和*理解的是,第一个将获得var的内存地址,后者将获得它引用的值。 通过这个概念,两个代码段应该是等价的,但第一个运行正常,而第二个编译,但给我一个运行时错误。 这是为什么?

在不使用指针指针的情况下反转链接列表

我已经使用以下代码成功实现了2指针解决方案: void list_reverse(t_list **begin_list) { t_list *new_root; t_list *root; t_list *next; new_root = 0; root = *(begin_list); while (root) { next = root->next; root->next = new_root; new_root = root; root = next; } *begin_list = new_root; } 哪个工作正常 – 至少根据我的测试。 现在我想尝试仅使用单个指针来反转链表,而不return ,所以我尝试将我的代码转换为void list_reverse(t_list *begin_list) ,但当然*begin_list = new_root不起作用,因为我无法更改begin_list 。 其余的似乎工作。 如何在没有双指针的情况下修改begin_list ? 编辑:结构是: typedef struct s_list […]

将Struct复制到函数C中的指针数组

我在C中分配内存有一个很大的问题 我有这个结构 typedef struct{ int x; int y; }T; 我想创建一个动态添加结构到指针的函数。 就像是: int main() { T* t; f(&t); free(t); } 到目前为止,我认为一切都很好,现在function是我迷路的地方 void f(T** t) { T t1; T t2; T t3; //first i malloc *t=malloc(sizeof(T)*T_MAX_SIZE);//i want another function to make the array bigger, but this is not as important as the problem t1.x=11; t1.y=12; t2.x=21; t2.y=22; […]

在C中为char数组赋一个char指针

我开始研究C,我已经遇到了一些问题。 我想解析一个文件并将每行的结果存储在一个结构中。 我的结构看起来像: struct record { char x[100]; } 然后,每当我使用strtok解析某些file.txt中的一行时, struct record R; … char *token; token = strtok(line, “\t”); token返回一个指向字符串的指针,每当我打印它时,它都是正确的字符串。 我想将标记分配给x,例如Rx = token ,但是我收到错误,“char x [100]不可分配”。 是否可以将此指针标记转换为实际的char数组,或者将结果存储到结构中的最佳方法是什么?

指针下标从负值开始

int nrow=5,ncol=7,i,j; float **ptr; /*allocation*/ ptr=(float **) malloc(nrow*sizeof(float*)); ptr[0]=(float *) malloc(nrow*ncol*sizeof(float)); /*initialize*/ for (i=0;i<nrow;i++) for (j=0;j<ncol;j++) ptr[i][j]=0.0; 我们知道在上面的例子中,行从0开始,以nrow-1结束,列从0开始,以nrow-1结束。 但是我如何让行从-4开始并以nrow+3结束,也让列从-4开始并以nrow+3结束? 补充代码: #include #include float *vector(int nl, int nh){ /* allocate a float vector with subscript range v[nl..nh] and initializing this vector, eg. vector[nl..nh]=0.0 */ float *v; int i,NR_END=0; v=(float *)malloc((size_t) ((nh-nl+1+NR_END)*sizeof(float))); for (i=0;i<(nh-nl+1+NR_END);i++) v[i]=0.0; return v-nl+NR_END; […]

创建connect 4 board c程序时出现分段错误

我正在创建一个连接4游戏……我已经做了很多事情; 然而,我创建我的电路板的方式是静态的,它需要是动态的,所以我已经制定了一个辅助程序来解决这个问题,然后在我的主程序中实现它。 出于某种原因,这段代码中的if&else-if条件会产生分段错误,我无法弄清楚为什么…… // for the rows/columns of the board for(row = num_rows – 1; row >= 0; row–){ printf(“|”); for(col = 0; col < num_columns; col++){ if(aPtr[row][col] == '0') { printf("| X "); } else if(aPtr[row][col] == '1') { printf("| O "); } else { printf("| "); } } puts("||"); } 当我评论这些条件时,电路板打印就好了,看起来像这样 —— Connect […]