我正在尝试学习C中的指针,并且已经完成了概念。我遇到了这个实验室问题,并试图为它编写一个解决方案。
/* p1.c
Write a short C program that declares and initializes (to any value you like) a
double, an int, and a char. Next declare and initialize a pointer to each of
the three variables. Your program should then print the address of, and value
stored in, and the memory size (in bytes) of each of the six variables.
Use the “0x%x” formatting specifier to print addresses in hexadecimal. You
should see addresses that look something like this: "0xbfe55918". The initial
characters "0x" tell you that hexadecimal notation is being used; the remainder
of the digits give the address itself.
Use the sizeof operator to determine the memory size allocated for each
variable.
*/
但是,编译程序时,我有两大类错误 -
我的printf语句的格式占位符似乎都错了。我的印象是内存地址可以使用%x或%p打印。但在我的程序中,都生成了编译器警告。我不明白 - 为什么在我以前的一些程序中,%p在没有任何警告的情况下工作,以及为什么%x和%p在这里都不起作用。有人可以帮我解决哪些占位符使用哪种数据类型?
另一个主要问题是分配指向字符变量的指针。当我运行这个程序时,我在程序的第三个printf语句中得到分段错误。我不确定为什么会如此 -
如果我是正确的,这样的声明 -
char array[]="Hello World!"
和char *ptr=array
将字符指针变量ptr
设置为指向数组变量array
的第一个元素。因此,理想情况下,*ptr
表示'H'
,*(ptr+1)
表示'e'
,依此类推。
遵循相同的逻辑,如果我有一个带有char var3
的字符变量'A'
,那么我应该如何使指针变量ptr3
指向它?
这是我写的程序 -
#include<stdio.h>
int main()
{
int var1=10;
double var2=3.1;
char var3='A';
int *ptr1=&var1;
double *ptr2=&var2;
char *ptr3=&var3;
printf("\n Address of integer variable var1: %x\t, value stored in it is:%d\n", &var1, var1);
printf("\n Address of double variable var2: %x\t, value stored in it is:%f\n", &var2, var2);
printf("\n Address of character variable var3: %x\t, value stored in it is:%s\n", &var3, var3);
printf("\n Address of pointer variable ptr1: %x\t, value stored in it is:%d\n", ptr1, *ptr1);
printf("\n Address of pointer variable ptr2: %x\t, value stored in it is:%f\n", ptr2, *ptr2);
printf("\n Address of pointer variable ptr3: %x\t, value stored in it is:%s\n", ptr3, *ptr3);
printf("\n Memory allocated for variable var1 is: %i bytes\n", sizeof(var1));
printf("\n Memory allocated for variable var2 is: %i bytes\n", sizeof(var2));
printf("\n Memory allocated for variable var3 is: %i bytes\n", sizeof(var3));
printf("\n Memory allocated for pointer variable ptr1 is: %i bytes\n", (void *)(sizeof(ptr1)));
return 0;
}
任何帮助都会非常感激。谢谢。
答案 0 :(得分:6)
除非char
的printf说明符为%c
(不是%s
),否则您完全正确。
遵循相同的逻辑,如果我有一个带有char
var3
的字符变量'A'
,那么我应该如何使指针变量ptr3
指向它?
请参阅您的代码以获得答案!
你在其他printf语句中遇到了一些类型不匹配的问题。在最后一个%i
使用(void *)
时,我不确定你在想什么。
要打印sizeof
使用%zu
的结果(并且不要投放到void *
),这适用于您最后的四个printf语句。
在其他声明中,您使用%x
打印地址。这是错误的(你的做法也是错误的)。您应该使用%p
打印地址。
从技术上讲,你也应该将地址转换为void *
,虽然在现代系统中,所有指针都具有相同的大小和表示,所以你可以放弃它。
答案 1 :(得分:1)
printf("\n Address of character variable var3: %x\t, value stored in it is:%s\n", &var3, var3);
printf("\n Address of pointer variable ptr3: %x\t, value stored in it is:%s\n", ptr3, *ptr3);
此处是问题。仔细看看 printf 和它的论点:
%s ,%s用于打印字符串。
什么是字符串?
字符串由 0+个字符加上&#39; \ 0&#39; 字符定义。
这里有什么问题?
Var3 声明为 char ,因此不 字符串。< / p>
printf尝试做什么?看看你的记忆:
(aa125121)(记忆随机地址) 65 aa aa aa
printf 尝试在65处读取并成功(打印)
printf 尝试阅读一些&#39; \ 0&#39;或其他字符值 BAMMM分段错误
您的程序可以访问错误的内存地址。
Soluce :
使用 %c
答案 2 :(得分:0)
由于您的任务需要使用0x%x
说明符\格式,因此第一个打印字符串应该是,例如:
printf("\n Address of integer variable var1: 0x%x\t, value stored in it is:%d\n", (unsigned int)&var1, var1);
接下来我相信你会以同样的方式理解。