![](/img/trans.png)
[英]Why am i getting segmentation fault error while accessing a second level pointer?? C language
[英]C language: Convert Pointer to String, what am I getting back?
我只是在尝试使用c进行一些系统级编程。 我遇到了一些模棱两可的事情,希望这里有人可以帮我解决。
如果我创建一个char *,然后按以下方式将地址输入函数
char* string;
os_IntToString(&string, string);
void os_IntToString(int value, char* str) {
int scancode_offset = 48;
char* start = *str;
do{
int piece = value % 10;
*str++ = piece + scancode_offset;
value = value / 10;
} while(value);
*str-- = '\0';
}
那我到底要回来什么? 我得到实数,例如589796。显然地址是向后的,但是它是什么基本系统?
内存地址是十六进制的吗? 但是函数使用的Int是十进制基数10? 那是对的吗? 我不知道是在进行转换过程还是现在有一个下位地址。
谁能解决这个问题。 非常感谢。
就C语言而言,地址不是“十六进制”,也不是数字。 地址只是地址或指针值。 根据您使用的系统的寻址方案,地址可能以十六进制表示 (例如,如果以printf
的"%p"
格式打印)。 您还可以将地址转换为整数,但是转换的结果是实现定义的-整数也不是“十六进制”的,尽管您可以生成人类可读的整数十六进制表示形式。 (整数以二进制形式表示。)
对于您的函数,您已经使用void
返回类型定义了它,然后尝试从中返回char*
值。 如果不是致命错误,则应该至少从编译器获得警告。
所有数据(内存地址,整数,指针,字符串,浮点数等)都内部存储为二进制或基数2。
以10为基数还是以16为基数,不是硬件或软件(libc,程序,汇编甚至CPU微码)如何存储和操作(二进制编码的十进制除外,除了某些显示和转换步骤)。
当返回一个int时,假设它以10为底(大多数将打印int的调用将其显示为10),对于硬件,它的含义是以2为底,与指针或内存地址相同。 它只是以这种方式打印。
此外,对于存储器地址,基数2仅是由于电路在CPU和北桥中的工作方式。 当您将其视为基础16时,它只是调试器的表示形式。 我们可以假设它以10为底数,并在内存中引用65536,但是使用10000
进行显示会更容易,因为尾随零会帮助程序员提示对齐。 这只是一个方便的表示。 我们可以使用基数13并将其命名为23AA3,但这很不方便。 当我们将其视为数字时,不一定是数字。 它是一个位置,虽然在某些方面可以视为一个数字,并且程序员可以方便地将其视为一个数字,但当今系统中内存映射的非线性性质可能会使这种考虑有些不正确。
虽然代码本身可能存在问题,但我只是在回答数字表示的问题。
地址不后退。 Printf shoudl始终打印大字节序。 如果您打印地址位置,如果将int值打印为589796,将其打印为十六进制,则将得到0x8FFE4 =589796。一切都会正常进行,因为无论如何打印,它都将正确的内存地址,只是具有不同的表示形式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.