嗨,我确信这一定是一个常见的问题,但是当我搜索它时,我找不到答案.我的问题主要涉及两个方面.我想比较他们的地址,并确定一个是否比另一个大.我希望在比较期间所有地址都是无符号的.这是真的,它在C89,C99和C++之间有所不同吗?当我用gcc编译时,比较是无符号的.
如果我有两个指针,我正在比较这样:
char *a = (char *) 0x80000000; //-2147483648 or 2147483648 ?
char *b = (char *) 0x1;
Run Code Online (Sandbox Code Playgroud)
然后a更大.这是由标准保证的吗?
编辑以更新我想要做的事情.我有一种情况,我想确定如果有算术错误,它不会导致指针超出界限.现在我有数组的起始地址和结束地址.如果出现错误并且指针计算错误,并且在数组内存的有效地址之外,我想确保没有发生访问冲突.我相信我可以通过比较另一个函数返回的可疑指针,并确定它是否在数组的可接受范围内来防止这种情况.负面和正面地址的问题与我是否可以进行比较有关,正如我在原始问题中所讨论的那样.
到目前为止,我很欣赏答案.基于我的编辑,你会说我正在做的是gcc和msvc中未定义的行为吗?这是一个仅在Microsoft Windows上运行的程序.
这是一个简单的例子:
char letters[26];
char *do_not_read = &letters[26];
char *suspect = somefunction_i_dont_control(letters,26);
if( (suspect >= letters) && (suspect < do_not_read) )
printf("%c", suspect);
Run Code Online (Sandbox Code Playgroud)
另一个编辑,在阅读AndreyT的答案后,似乎是正确的.因此我会做这样的事情:
char letters[26];
uintptr_t begin = letters;
uintptr_t toofar = begin + sizeof(letters);
char *suspect = somefunction_i_dont_control(letters,26);
if( ((uintptr_t)suspect >= begin) && ((uintptr_t)suspect < toofar ) )
printf("%c", suspect);
Run Code Online (Sandbox Code Playgroud)
感谢大家!
我想知道Visual Studio创建的调试文件中包含的隐私和个人信息.
我有一个项目,我已经编译了调试和发布,我必须基本上压缩包含解决方案,源,pdbs等的整个目录树,并使其可用.
我想知道通过这样做会发布什么类型的信息,除了源和二进制文件之外.
谢谢!
我知道这是一个简单的问题,但我很困惑.我有一个相当典型的gcc警告,通常很容易修复:
warning: comparison between signed and unsigned integer expressions
每当我有一个带有最高有效位的十六进制常量时,如0x80000000L,编译器会将其解释为无符号.例如,使用-Wextra编译此代码将导致警告(gcc 4.4x,4.5x):
int main()
{
long test = 1;
long *p = &test;
if(*p != 0x80000000L) printf("test");
}
Run Code Online (Sandbox Code Playgroud)
我已经特别为常量加了后缀,为什么会发生这种情况呢?
据我所知,在C++中,标识符中的双下划线是为编译器保留的.我有一些C代码,它们在相应的头文件中具有与此类似的特性:
extern "C" {
#define HELLO__THERE 1
int hello__out__there( int );
}
Run Code Online (Sandbox Code Playgroud)
我将在C++项目中使用此标头,并计划在C++中执行以下操作:
if (HELLO__THERE == abc)
hello__out__there(foo);
Run Code Online (Sandbox Code Playgroud)
这是标准所涵盖的C++中可接受的行为吗?