相关疑难解决方法(0)

sizeof(某些指针)总是等于4吗?

例如: sizeof(char*)返回4一样int*,long long*,我已经竭尽所能.这有什么例外吗?

c c++ memory pointers sizeof

217
推荐指数
8
解决办法
11万
查看次数

((void*) - 1)是一个有效的地址吗?

来自Linux的man shmat逐字:

返回值

返回错误(void*)-1,并设置errno以指示错误原因.

(POSIX使用略有不同的措辞来讲述相同的内容.)

是否有任何强制性规则或定义(标准?)(void *) -1可能不是有效地址?

c void-pointers

17
推荐指数
3
解决办法
3419
查看次数

什么时候uintptr_t优于intptr_t?

鉴于我需要在结构中存储"泛型"指针的值并且对指向的内存本身没有兴趣,我发现将它存储为intptr_t比a 更为语义正确void*.问题是a uintptr_t是否更适合,并且当一个人更喜欢另一个人时?

c pointers void-pointers

17
推荐指数
3
解决办法
6670
查看次数

在64位指针中使用额外的16位

我读到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个字节用于密钥(由于对齐限制),可以将密钥嵌入到指针中.

64-bit pointers x86-64 memory-access

6
推荐指数
3
解决办法
4559
查看次数

返回不同数据类型的C函数的正确返回类型是什么

曾经有人要求我写一个函数,它会在一些成功的条件下返回指向内存中某些数据的指针,否则它应该返回"-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)

c

4
推荐指数
1
解决办法
1681
查看次数

无效* p ...; if(p&gt; 0)....这是未定义的行为吗?

编译器升级后,我遇到了新的警告消息。

警告:整数为零的指针的有序比较[-Wextra]

    if (inx > 0)
Run Code Online (Sandbox Code Playgroud)

事实证明inx是一个指针。通常,我希望看到这个旧代码与0或NULL进行比较。这使我考虑了有符号和无符号的值以及可能的风险。

一些研究表明:

这些似乎表明一个地址(由malloc返回)永远不能为零。

这将我带到了标准的旧版本。

4.10指针转换

1空指针常量是整数类型的整数常量表达式(5.19)prvalue,其值为零或std :: nullptr_t类型的prvalue。空指针常量可以转换为指针类型。结果是该类型的空指针值,并且可以与指向对象或函数类型的指针的所有其他值区分开。这种转换称为空指针转换。相同类型的两个空指针值应比较相等。空指针常量到cv限定类型的指针的转换是一次转换,而不是指针转换后跟有资格转换的序列(4.4)。整数类型的空指针常量可以转换为std :: nullptr_t类型的prvalue。

它特别指出两个空指针比较相等。

考虑到这一点,那小段代码是未定义的行为吗?还是我想念的难题还有另外一块?

c++ pointers

2
推荐指数
1
解决办法
1199
查看次数

为什么"gcc -Wall"没有警告"if(ptr <0)"?

(长话故事......你可以直接跳到最后的问题......)

我需要使用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(甚至没有 …

c gcc pointers gcc-warning

2
推荐指数
2
解决办法
246
查看次数

使用malloc()获取唯一指针

所以,我有一些函数返回指针,或NULL出错.现在我想为不同的错误/条件添加另一个可能的值.我之前在其他一些答案中听到过这种情况 - 使用malloc()创建一个唯一的指针,它将作为这些函数返回的可能值(所以现在可以返回一个正确的指针,NULL或者0xWhatever你可以肯定0xWhatever不会用于还要别的吗).所以,自然malloc(1)可能是一个安全的赌注,但我想知道这是否malloc(0)也是安全的.将一个malloc(0)地址可能会被用于其他的东西?有人可以澄清一下这种技术应该如何运作,也许它的名称是什么?

c malloc pointers

1
推荐指数
1
解决办法
489
查看次数

指针地址跨越各种平台

在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)

c error-handling pointers void-pointers memory-address

0
推荐指数
1
解决办法
260
查看次数