我是C编程的新手,很想得到一些帮助。 我有这个结构: typedef struct house { int numOfRooms; char* houseName; }HOUSE,*pHOUSE; 我想创建一个函数来获取指向HOUSE的指针,并返回一个新指针,指向位于内存中不同位置的同一个HOUSE – 目的是能够在不改变两者的情况下更改一个指针:我将尝试更清晰: pHOUSE duplicate_house(pHOUSE house) { pHOUSE newh = (pHOUSE)calloc(1,sizeof(HOUSE)); newh = house //I get here a pointer that points on the same house.. so If I change for exmample: // newh->numOfRooms = 9 – > both will change and I don’t want […]
Mmap返回void *,但不返回volatile void* 。 如果我正在使用mmap来映射共享内存,那么另一个进程可能正在写入该内存,这意味着来自同一内存位置的两个后续读取可能会产生不同的值 – 这意味着volatile的确切情况。 那么为什么它不会返回一个易变的空隙*? 我最好的猜测是,如果你有一个专门写入共享内存段的进程,它不需要通过volatile指针查看共享内存,因为它总能正确理解存在的内容; 编译器为防止冗余读取所做的任何优化都无关紧要,因为没有其他任何内容可以写入并更改其下的值。 还是有其他一些历史原因? 我倾向于说返回volatile void*将是一个更安全的默认值,那些想要这个优化的人可以手动转换为void *。 POSIX mmap说明: http : //opengroup.org/onlinepubs/007908775/xsh/mmap.html
我正在尝试使用Stephen Prata的C Primer Plus自学C,其中一个章末练习是“编写一个用字符串反转替换字符串内容的函数”。 这是一个关于具有良好指针的字符串的章节。 我试图尽可能多地使用指针,所以我可以更好地理解,但我被卡住了。 我的问题是,当我在main中打印返回指针的值时,它是乱码。 当我使用gdb(只是学习如何使用它)时,我可以看到从我的函数返回的内存地址与函数中使用的内存地址相同,并且它已被主动分配给我的指针,尽管我可以告诉。 我尝试了很多东西,我错过了什么? FWIW我还没有在书中了解过malloc,虽然我看到它在我经常尝试更好地理解C的各种www页面上引用。 $ cc -o exercise8 exercise8.c && ./exercise8 This is s1 before: abcd This is s2 in function: dcba This is s3 after: d`! /* A function that replaces the contents of a string with the string reversed. */ #include #include char *str_rev(char * string); int […]
我无法弄清楚这一点。 也许是因为凌晨2点。 无论如何,我在这里不知所措。 #include int main() { char array[] = “123456789”; char* ptr = array; printf(“%c\n”, *(ptr++)); printf(“%c\n”, *ptr); *ptr = array[3]; printf(“%c\n”, *(ptr++)); printf(“%c\n\n”, *ptr); return 0; } 结果是: 1 2 4 3 我有一个指针,我分配给array 。 然后我打印,我认为是第一个索引( ‘2’ ),而是得到1 。 – 所以,我假设*(ptr++)实际上是取消引用,然后才增加指针。 然后我重新分配ptr第四个索引( ‘4’ )并重复步骤2.这样就可以正常工作,因为我看到C在解除引用之前不会先计算括号。 然后我打印新增加的ptr来显示( ‘5’ )……然后我得到3 ? 那是怎么回事,第1步和第2步以及第3步和第4步是相同的,但是我得到了不同的结果?
我有一个文本文件text.txt读取(为简单起见) this is line one this is line two this is line three 为了简单起见,我只是试图将每行中的第一个字符设置为’x’,所以我想要的结果是 xhis is line one xhis is line two xhis is line three 所以我打开text.txt文件并尝试用所需的输出覆盖每一行到同一文本文件。 在while循环中,我将每行中的第一个字符设置为“x”。 我还将变量“line”设置为等于1,因为如果它在第一行,我想回放到文件的开头,以便在开始时而不是在文件的末尾进行覆盖。 然后增加行,以便在下一次迭代时跳过倒带,并且应该继续覆盖第2行和第3行。 它适用于第一线。 有人有任何解决方案吗? 顺便说一句,我已经在stackoverflow和其他网站上进行了广泛的研究,但没有运气。 这是我的代码,我的输出也在下面: #include #include #define MAX 500 int main() { char *buffer = malloc(sizeof(char) * MAX); FILE *fp = fopen(“text.txt”, “r+”); int line […]
我有两种错误: 编译器的投诉 pr.c:在函数’main’中: pr.c:20:2:警告:从不兼容的指针类型[默认启用]传递’printMatrix’的参数1 pr.c:9:6:注意:预期’const int(*)[80]’但参数的类型为’int(*)[80]’ pr.c:22:2:警告:从不兼容的指针类型[默认启用]传递’lights’的参数1 pr.c:10:6:注意:预期’const int(*)[80]’但参数的类型为’int(*)[80]’ 似乎编译器抱怨在接受const的函数中接收非const,但我被告知这是使用const的正确方法… #include #include #define MAXCOL 80 #define MAXROW 20 #define randNormalize() srand(time(0)) void fillMatrix(int m[][MAXCOL], size_t rows, size_t cols); void printMatrix(const int m[][MAXCOL], size_t rows, size_t cols); void lights(const int m[][MAXCOL], size_t rows, size_t cols); int star(const int m[][MAXCOL], int row, int col); int main() { […]
我是编程的新手,从Objective-C开始,但决定在进一步发展之前回到基础。 我在C上花了一些时间,并且在指针混乱中挣扎。 我的问题是关于K&R如何实现fgets(p165,第2版)。下面的代码直接来自文本并附有我的几条评论。 char* fgets(char* s, int n, FILE *iop) { register int c; register char* cs; cs = s; while(–n > 0 && (c = getc(iop)) != EOF) { // put the input char into the current pointer position, then increment it // if a newline entered, break if((*cs++ = c) == ‘\n’) break; […]
我正在尝试从函数参数返回数据指针: bool dosomething(char *data){ int datasize = 100; data = (char *)malloc(datasize); // here data address = 10968998 return 1; } 但是当我按以下方式调用该函数时,数据地址变为零: char *data = NULL; if(dosomething(data)){ // here data address = 0 ! (should be 10968998) } 我究竟做错了什么?
我需要一个带有2D数组并生成随机位的函数,因此结果是一个随机二进制字符串数组。 我有以下代码, #define pop_size 50 #define chrom_length 50 main() { int population[pop_size][chrom_length]; init_pop(&population); } int init_pop(int *population[][]) { for(i = 0; i < pop_size; i++) { for(j = 0; j < chrom_length; j++) { *population[i][j] = rand() % 2; } } return 0; } 在编译时,我收到以下错误消息: 数组类型具有不完整的元素类型 有什么建议?
#include int main() { int i,n; int a = 123456789; void *v = &a; unsigned char *c = (unsigned char*)v; for(i=0;i< sizeof a;i++) { printf("%u ",*(c+i)); } char *cc = (char*)v; printf("\n %d", *(cc+1)); char *ccc = (char*)v; printf("\n %u \n", *(ccc+1)); } 该程序在我的32位Ubuntu机器上生成以下输出。 21 205 91 7 -51 4294967245 前两行输出我能理解=> 第1行 :在内存中存储字节的顺序。 第二行 :第二个字节值的有符号值(2的补码)。 […]