我试图取消引用指向 an 的指针unsigned char*,但程序因段错误而崩溃,因为它的值始终为 0xffffffffffffffff。在取消引用指针之前,我想检查它的指向地址是否与 0xffffffffffffffff 不同(以避免段错误)。如何在不对 0xffffffffffffffff 进行硬编码的情况下进行检查?IE,
unsigned char* pointer;
...
// I would rather use something which works for x86 or x64 machine
if( pointer & 0xffffffffffffffff >= 0xffffffffffffffff - 1 ) {
// exit
}
Run Code Online (Sandbox Code Playgroud)
我正在研究,发现这个https://www.qnx.com/developers/docs/6.4.1/dinkum_en/c99/stdint.html#UINTPTR_MAX,但是 UINTPTR_MAX 似乎是指针的整数的最大值指向除最大值以外的指针地址。
问题是一致的,每次分段错误,指针的值为0xffffffffffffffff。

我知道我应该修复我的应用程序,以便指针不会设置为无效地址 0xffffffffffffffff,但代码库相当大且复杂,我不确定如何重现该问题。因此,虽然不知道如何将该指针设置为无效地址,但我想进行保护。
只是出于闲置的好奇心,我如何有目的地使指针指向unsigned char*该地址0xffffffffffffffff(目标机器上的最大地址)?我的程序正在某处执行此操作,但我不知道如何执行,因为我仍在寻找罪魁祸首。
我正在阅读 linux功能测试宏页面,并在注释部分指出:
<features.h> 是 Linux/glibc 特定的头文件。其他系统也有类似的文件,但通常具有不同的名称。该头文件会根据需要自动包含在其他头文件中:无需显式包含它即可使用功能测试宏。
我知道其他系统不会具有与 features.h 相同的文件名,因此您不应直接包含它。但是,如果不包含头文件,如何知道是否可以使用功能测试宏?
使用LLVM编译器编译以下代码时,它无法正常运行.(我没有增加.)在使用GCC 4.2进行编译时,它可以正常运行.这是LLVM编译器的错误吗?
#include <stdio.h>
#include <string.h>
void BytesFromHexString(unsigned char *data, const char *string) {
printf("bytes:%s:", string);
int len = (int)strlen(string);
for (int i=0; i<len; i+=2) {
unsigned char x;
sscanf((char *)(string + i), "%02x", &x);
printf("%02x", x);
data[i] = x;
}
printf("\n");
}
int main (int argc, const char * argv[])
{
// insert code here...
unsigned char data[64];
BytesFromHexString(data, "4d4f5cb093fc2d3d6b4120658c2d08b51b3846a39b51b663e7284478570bcef9");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
typedef struct Y {int X;} X;
enum E {X};
Run Code Online (Sandbox Code Playgroud)
这会产生错误:
错误:'X'重新声明为不同类型的符号
据我所知,C隐式定义了结构,联合和枚举标记以及它们的成员的名称空间.所以,我不确定为什么会E::X碰到typedef结构标签X?
C中的名称空间究竟是什么?
如果我有条件;
int a = 1;
int b = 3;
if ((a/b) > 0) ...
Run Code Online (Sandbox Code Playgroud)
中间结果(a/b)是否像浮点数(0.33)或int(0因为舍入而)?我来自VB6世界,并且这个条件会评估为false,因为当分割两个整数时,中间结果也将是一个整数(并且0> 0 = false).
我写的时候:
if ((1/3) > 0) ...
Run Code Online (Sandbox Code Playgroud)
我是否需要将其中一个操作数转换为(float)以使此条件成立?或者什么是默认的变量类型C正在使用?
如果我愿意写:
if ((1.0/3) > 0) ...
Run Code Online (Sandbox Code Playgroud)
情况现在已经改变了,因为编译器注意到其中一个操作数必须是浮点数?
假设我有一个包含大型结构的全局变量:
typedef struct {
char Big[1024]
} LARGE;
static LARGE x;
void main()
{
free(x);
}
Run Code Online (Sandbox Code Playgroud)
当我不再需要它时,我可以安全地从主电话免费拨打(x)吗?
基本上,我在C中有一个内联函数:
struct array {
unsigned long size;
void* items;
};
typedef struct array* Array;
inline Array array_create(unsigned long initsize);
inline void array_free(Array this);
Run Code Online (Sandbox Code Playgroud)
我是否可以this在这种情况下自由使用关键字,或者更好地避免它,以及为什么(不是)?
编辑:这个问题起源于我使用的代码中的一个错误,inline void array_free(Array array);它改变了结果sizeof(array);并给了我使用的想法,this而不是适应(在我看来丑陋)sizeof(struct array);.
我在这个网站上已经阅读了几个关于这个主题的问题,但我仍然有疑问.
在标准C中,我们可以阅读:
6.3.2.3.p.5:整数可以转换为任何指针类型.[...]
6.3.2.3.p.6:任何指针类型都可以转换为整数类型.[...].
省略的文本(将放在括号[...]中)只讨论转换失败时可能发生的问题.
但是我的问题更为笼统:
我的问题是:我的解释(3)是正确的吗?
另一方面,当我们定义一个大小为N的类型T的数组时,
由于我们可以对数组的位置进行整数运算,
因此很明显,至少在"本地"级别,在数组中,
我们有相应的数组内存块的
运算方式与从0到N-1的数字集相同.
通过定义数组或分配的对象,我们可以确定,在C中,
内存地址可以被"本地"视为算术上等同于整数的子集.
然而,这种"局部"行为不足以得出
标准C假设存储器模型的结论,该存储器模型的存储器地址可被视为"仅一个且同一组整数"的一部分.
然而,6.3.2.3.p5/p6似乎"暗示"这个更强大的断言,尽管我并不完全确定.
另一个问题可能会带来更多亮点:
p,q,(即:p != q)中,当转换成整数型,所得到的整数值变得相等.我正在编写一个应用程序,它首先从unix管道接收数据,然后提示用户输入.我似乎无法弄清楚为什么在提示用户输入之前管道的输入似乎没有正确关闭.感觉我在这里缺少一些非常基本的东西.
我曾尝试提出了冲洗标准输入所有的例子在这里没有成功.这也似乎有可能相关,但我还没有设法提取任何相关的答案.
#include <stdio.h>
#include <stdlib.h>
#define BUFSZ 1024
int main(void) {
char *buf = calloc(BUFSZ, sizeof(char));
while(fgets(buf, BUFSZ, stdin)) { printf("Pipe input: %s", buf); }
printf("Enter input: ");
fgets(buf, BUFSZ, stdin);
printf("User input: %s", buf);
free(buf);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
用法和输出示例:
$ cat testdata2 | ./a.out
Pipe input: testdata testdata
Pipe input: testdata testdata2
Pipe input: testdata testdata3
Pipe input: testdata testdata4
Pipe input: testdata testdata5
Pipe input: testdata testdata6
Pipe input: testdata testdata7
Enter input: …Run Code Online (Sandbox Code Playgroud)