码: #include int main() { char *str; char i = ‘a’; str = &i; str = “Hello”; printf(“%s, %c, %x, %x”, str, i, str, &i); return 0; } 我得到这个输出: Hello, a, 403064, 28ff0b 我有两个疑问: 如何在不为其分配任何内存的情况下存储字符串。 str是一个字符指针,指向char变量i 。 当我添加str = “Hello”; 我不是使用该位置的5个字节,其中4未分配? 因为,我编码str = &i; 当我打印它们时,不应该str和&i具有相同的值吗? 当我删除str = “Hello”; 语句str和&i是一样的。 如果str和&i相同,那么我相信当我说str = “Hello”它应该用’H’覆盖’a’ ‘H’而其余’ello\0’进入后续字节。 我相信整个问题是str = […]
当我声明一个接受const char*的函数并且我传递一个字符串文字时,我得到一个 警告:[2066]类型限定符在分配中不匹配 因为字符串文字是rom const char* 。 反过来也是这样。 尽管PIC是哈佛架构,但内存映射到一个连续的地址空间,因此理论上应该可以同样的方式支持ram和rom指针。 可能我必须使用rom指针,因为它们是24位而ram指针是16位。 但是,只是将const char*转换为const rom char*不起作用。
基于这个问题( c中的奇怪输出问题 )有一个答案( 由@Lundin提供 )关于这一行: int *ptr = (int*)(&a+1); 在哪里他说: the cast (int*) was hiding this bug 。 所以我带来了以下内容: #include int main( void ){ int a[5] = {1,2,3,4,5}; int *ptr = *( ( &a ) + 1 ); printf(“%d”, *(ptr-1) ); } 我想知道这是否: int *ptr = *( ( &a ) + 1 ); 标准明确定义了吗? 编辑 […]
在C中声明指针时,有2个(编辑:3)变体: 变式A: int* ptr; 变式B: int *ptr; 变式C: int * ptr; 在A中,间接运算符已附加到该类型。 在B中,间接运算符已预先添加到变量中。 在C中,间接运算符在类型和变量之间自由站立。 声明指针的方式因我阅读的文档类型而异。 一些作者似乎偏好某些变体,其他人则使用几种变体。 我是否正确地假设不同变体之间的function没有区别? 如果是,是否存在一个变量应该在C中使用的约定?
我遇到了这个程序的问题。 这很简单。 我需要从我创建的指针中为我的结构赋值,但是我一直遇到分段错误。 我有什么想法我做错了: #include #include struct problem37 { int a; int b; int c; }; int main() { printf(“Problem 37\n”); //create struct struct problem37 myStruct; //create the pointer int* p; int* q; int* r; *p = 1; *q = 5; *r = 8; //read the data into the struct using the pointers myStruct.a = […]
我想知道我是否可以在64位应用程序中使用32位指针? 我们学校的项目只允许我们将c程序编译成64位应用程序,并测试我们的程序的速度和内存使用情况。 但是,如果我能够使用32位指针,那么我的程序将比64位消耗更少的内存,也许它运行得更快(更快到malloc?) 谢谢您的帮助
在我的回答中,我提到解除引用void指针是一个坏主意。 但是,当我这样做时会发生什么? #include int main (void) { void* c = malloc(4); *c; &c[0]; } 汇编: gcc prog.c -Wall -Wextra prog.c: In function ‘main’: prog.c:4:2: warning: dereferencing ‘void *’ pointer *c; ^~ prog.c:5:4: warning: dereferencing ‘void *’ pointer &c[0]; ^ prog.c:5:2: warning: statement with no effect [-Wunused-value] &c[0]; ^ 这是来自Wandbox的图片,对于那些说它没有发生的人: 和Ideone中的现场演示 。 它实际上会尝试读取c指向的内存,然后获取该结果,但实际上什么都不做? 或者这条线根本没有效果(但GCC不会产生警告)。 我在想,既然编译器对数据类型一无所知,在不知道类型大小的情况下,它将无法做很多事情。 为什么derefencing […]
这是Quake III Arena的快速反平方根实现: float Q_rsqrt( float number ) { long i; float x2, y; const float threehalfs = 1.5F; x2 = number * 0.5F; y = number; i = * ( long * ) &y; // evil floating point bit level hacking i = 0x5f3759df – ( i >> 1 ); // what? y = […]
我是网络编程的新手。 以下结构定义让我很困惑。 这里h_addr_list是一个定义为字符串数组,但它用于存储in_addr结构的数组。 为什么它没有定义为struct in_addr **h_addr_list而不是char **h_addr_list ? struct hostent { char *h_name; /* Official domain name of host */ char **h_aliases; /* Null-terminated array of domain names */ int h_addrtype; /* Host address type (AF_INET) */ int h_length; /* Length of an address, in bytes */ char **h_addr_list; /* Null-terminated array of in_addr structs […]
为什么数组索引比指针快? 指针不应该比数组索引快吗? **我使用time.h clock_t来测试两个函数,每个函数循环200万次。 Pointer time : 0.018995 Index time : 0.017864 void myPointer(int a[], int size) { int *p; for(p = a; p < &a[size]; p++) { *p = 0; } } void myIndex(int a[], int size) { int i; for(i = 0; i < size; i++) { a[i] = 0; } }