例如:
sizeof(char*)
返回4一样int*
,long long*
,我已经竭尽所能.这有什么例外吗?
来自Linux的man shmat
逐字:
返回值
返回错误(void*)-1,并设置errno以指示错误原因.
(POSIX使用略有不同的措辞来讲述相同的内容.)
是否有任何强制性规则或定义(标准?)(void *) -1
可能不是有效地址?
鉴于我需要在结构中存储"泛型"指针的值并且对指向的内存本身没有兴趣,我发现将它存储为intptr_t
比a 更为语义正确void*
.问题是a uintptr_t
是否更适合,并且当一个人更喜欢另一个人时?
我读到64位机器实际上只使用48位地址(具体来说,我使用的是英特尔酷睿i7).
我希望额外的16位(位48-63)与地址无关,并将被忽略.但是当我尝试访问这样的地址时,我收到了一个信号EXC_BAD_ACCESS
.
我的代码是:
int *p1 = &val;
int *p2 = (int *)((long)p1 | 1ll<<48);//set bit 48, which should be irrelevant
int v = *p2; //Here I receive a signal EXC_BAD_ACCESS.
Run Code Online (Sandbox Code Playgroud)
为什么会这样?有没有办法使用这16位?
这可用于构建更多缓存友好的链表.不是将8个字节用于下一个ptr,而是将8个字节用于密钥(由于对齐限制),可以将密钥嵌入到指针中.
曾经有人要求我写一个函数,它会在一些成功的条件下返回指向内存中某些数据的指针,否则它应该返回"-1".在这种情况下,什么是正确的返回类型.如果我只需要返回数据,那么我将使用char*作为函数myfunction的返回类型.但在这种情况下,我可能会返回-1有返回类型.
<what-type> myfunction() {
char *data;
if (some condition true)
return data;
else
return -1
}
int main () {
myfunction
}
Run Code Online (Sandbox Code Playgroud) 编译器升级后,我遇到了新的警告消息。
警告:整数为零的指针的有序比较[-Wextra]
Run Code Online (Sandbox Code Playgroud)if (inx > 0)
事实证明inx是一个指针。通常,我希望看到这个旧代码与0或NULL进行比较。这使我考虑了有符号和无符号的值以及可能的风险。
一些研究表明:
这些似乎表明一个地址(由malloc返回)永远不能为零。
这将我带到了标准的旧版本。
4.10指针转换
1空指针常量是整数类型的整数常量表达式(5.19)prvalue,其值为零或std :: nullptr_t类型的prvalue。空指针常量可以转换为指针类型。结果是该类型的空指针值,并且可以与指向对象或函数类型的指针的所有其他值区分开。这种转换称为空指针转换。相同类型的两个空指针值应比较相等。空指针常量到cv限定类型的指针的转换是一次转换,而不是指针转换后跟有资格转换的序列(4.4)。整数类型的空指针常量可以转换为std :: nullptr_t类型的prvalue。
它特别指出两个空指针比较相等。
考虑到这一点,那小段代码是未定义的行为吗?还是我想念的难题还有另外一块?
(长话故事......你可以直接跳到最后的问题......)
我需要使用realpath(3)
所以我写了一个简单的例子来尝试它:
$> cat realpath.c
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
int main(int argc, char * argv[])
{
char pathname[PATH_MAX];
if (realpath(argv[1], pathname) < 0) {
perror("realpath");
return 1;
}
printf("%s\n", pathname);
return 0;
}
$> gcc -Wall -o realpath realpath.c
$> ls /xxx
ls: cannot access '/xxx': No such file or directory
$> ./realpath /xxx/foo/bar
/xxx
Run Code Online (Sandbox Code Playgroud)
结果./realpath /xxx/foo/bar
让我感到惊讶.根据手册,失败更有意义ENOENT
.我甚至提到了POSIX并没有找到答案.经过一段时间后,我重读了手册并找到了realpath(3)
退货char *
而不是int
.我真的很恼火gcc
.
那么为什么 gcc(甚至没有 …
所以,我有一些函数返回指针,或NULL
出错.现在我想为不同的错误/条件添加另一个可能的值.我之前在其他一些答案中听到过这种情况 - 使用malloc()
创建一个唯一的指针,它将作为这些函数返回的可能值(所以现在可以返回一个正确的指针,NULL
或者0xWhatever
你可以肯定0xWhatever
不会用于还要别的吗).所以,自然malloc(1)
可能是一个安全的赌注,但我想知道这是否malloc(0)
也是安全的.将一个malloc(0)
地址可能会被用于其他的东西?有人可以澄清一下这种技术应该如何运作,也许它的名称是什么?
在C中编码时的常见情况是编写返回指针的函数.如果在运行期间写入函数内发生某些错误,NULL
可能会返回以指示错误.NULL
只是特殊的内存地址0x0,除了表示特殊条件的出现之外,它从不用于任何东西.
我的问题是,是否有任何其他特殊的内存地址永远不会用于用户态应用程序数据?
我想知道这个的原因是因为它可以有效地用于错误处理.考虑一下:
#include <stdlib.h>
#include <stdio.h>
#define ERROR_NULL 0x0
#define ERROR_ZERO 0x1
int *example(int *a) {
if (*a < 0)
return ERROR_NULL;
if (*a == 0)
return (void *) ERROR_ZERO;
return a;
}
int main(int argc, char **argv) {
if (argc != 2) return -1;
int *result;
int a = atoi(argv[1]);
switch ((int) (result = example(&a))) {
case ERROR_NULL:
printf("Below zero!\n");
break;
case ERROR_ZERO:
printf("Is zero!\n");
break;
default:
printf("Is %d!\n", *result);
break;
}
return 0; …
Run Code Online (Sandbox Code Playgroud)