标签: pointers

malloc(0)返回什么?

什么malloc(0)回报?答案是否相同realloc(malloc(0),0)

#include<stdio.h>
#include<malloc.h>
int main()
{
        printf("%p\n", malloc(0));
        printf("%p\n", realloc(malloc(0), 0));
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

linux gcc的输出:

manav@manav-workstation:~$ gcc -Wall mal.c
manav@manav-workstation:~$ ./a.out
0x9363008
(nil)
manav@manav-workstation:~$
Run Code Online (Sandbox Code Playgroud)

输出每次都在变化malloc(0).这是标准答案吗?除了学术研究之外,为什么有人会对获得这样的指针感兴趣?

编辑:

如果malloc(0)返回虚拟指针,那么后续工作原理如何:

int main()
{
    void *ptr = malloc(0);
    printf("%p\n", realloc(ptr, 1024));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

以下代码为每次迭代输出"可能".为什么不失败?

#include<stdio.h>
#include<malloc.h>
int main()
{

        int i;
        void *ptr;
        printf("Testing using BRUTE FORCE\n");
        for (i=0; i<65000; i++)
        {
                ptr = malloc(0);
                if (ptr == realloc(ptr, 1024))
                        printf("Iteration %d: possible\n", …
Run Code Online (Sandbox Code Playgroud)

c linux malloc pointers realloc

53
推荐指数
5
解决办法
3万
查看次数

*&和**&在C++中的含义

我在函数声明中多次发现这些符号,但我不知道它们是什么意思.

例:

void raccogli_dati(double **& V, double **p, int N) { 
  int ultimo = 3; 
  V = new double * [N/2]; 
  for(int i=0; i < N/2; i++) { 
    V[i] = new double[N/2], std :: clog << "digita " << N/2 - i
                 << " valori per la parte superiore della matrice V: "; 
    for(int j=i; j < N/2; j++) 
      std :: cin >> V[i][j], p[ultimo++][0] = (V[i][j] /= sqrt(p[i][0]*p[j][0]));
  } 
  for(int i=1; i < N/2; i++) 
    for(int j=0; j < …
Run Code Online (Sandbox Code Playgroud)

c++ syntax pointers symbols reference

53
推荐指数
6
解决办法
8万
查看次数

如何从C++中指向向量的指针访问向量的内容?

我有一个指向矢量的指针.现在,我如何通过指针读取向量的内容?

c++ pointers vector

53
推荐指数
5
解决办法
19万
查看次数

为什么解除引用运算符(*)也用于声明指针?

我不确定这是否是一个正确的编程问题,但它总是困扰我,我想知道我是否是唯一的.

在最初学习C++时,我理解了引用的概念,但指针让我感到困惑.你为什么问?因为你如何声明一个指针.

考虑以下:

void foo(int* bar)
{
}


int main()
{
    int x = 5;
    int* y = NULL;

    y = &x;
    *y = 15;     
    foo(y);

}
Run Code Online (Sandbox Code Playgroud)

该函数foo(int*)int指针作为参数.由于我已经声明yint指针,我可以传递yfoo,但是当我第一次学习C++时,我将*符号与解除引用相关联,因此我认为int需要传递一个解引用.我会试图通过*y进入foo,这显然是行不通的.

用一个单独的运算符来声明指针会不会更容易?(或用于解除引用).例如:

void test(int@ x)
{
}
Run Code Online (Sandbox Code Playgroud)

c++ syntax pointers notation dereference

53
推荐指数
6
解决办法
6195
查看次数

何时访问指向"死"对象的指针有效?

首先,澄清一点,我不是在谈论解除引用无效指针!

考虑以下两个例子.

例1

typedef struct { int *p; } T;

T a = { malloc(sizeof(int) };
free(a.p);  // a.p is now indeterminate?
T b = a;    // Access through a non-character type?
Run Code Online (Sandbox Code Playgroud)

例2

void foo(int *p) {}

int *p = malloc(sizeof(int));
free(p);   // p is now indeterminate?
foo(p);    // Access through a non-character type?
Run Code Online (Sandbox Code Playgroud)

以上示例中的任何一个都会调用未定义的行为吗?

上下文

提出这个问题是为了回应这一讨论.建议是,例如,指针参数可以通过x86段寄存器传递给函数,这可能导致硬件异常.

根据C99标准,我们学习以下内容(强调我的):

[3.17] 不确定值 - 未指定的值或陷阱表示

然后:

[6.2.4 p2]当指向的对象到达其生命周期的末尾时,指针的值变得不确定.

然后:

[6.2.6.1 p5]某些对象表示不需要表示对象类型的值.如果对象的存储值具有这样的表示并且由不具有字符类型的左值表达式读取,则行为是未定义的.如果这样的表示是由副作用产生的,该副作用通过不具有字符类型的左值表达式修改对象的全部或任何部分,则行为是未定义的.这种表示称为 …

c pointers undefined-behavior language-lawyer

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

我应该显式地转换malloc()的返回值吗?

我想询问以下案例:

char *temp;
temp = malloc(10);
Run Code Online (Sandbox Code Playgroud)

由于返回类型mallocvoid*,在被分配给temp之前,是否会malloc被隐式转换为char*类型返回的指针?标准在这方面说了什么?

如果我们的指针变量是某种结构类型,例如:

struct node *temp;
temp = (struct node *)malloc(sizeof(struct node));
Run Code Online (Sandbox Code Playgroud)

如果我们将内存分配给temp而不struct node*将其强制转换为类型,是否会将其隐式转换为struct node*类型,还是必须将其显式转换为struct node*类型?

c pointers casting

52
推荐指数
3
解决办法
2万
查看次数

函数指针作为参数

我尝试调用一个函数,该函数作为函数指针传递,没有参数,但我不能使它工作.

void *disconnectFunc;

void D::setDisconnectFunc(void (*func)){
    disconnectFunc = func;
}

void D::disconnected(){
    *disconnectFunc;
    connected = false;
}
Run Code Online (Sandbox Code Playgroud)

c++ pointers function-pointers function

52
推荐指数
3
解决办法
9万
查看次数

使用指针从单链表中删除项目

在最近的Slashdot访谈中, Linus Torvalds给出了一个例子,说明一些人如何使用指针,表明他们并不真正理解如何正确使用它们.

不幸的是,由于我是他所谈论的人之一,我也不理解他的例子:

我见过太多人通过跟踪"prev"条目删除单链表项,然后删除条目,做类似的事情

if (prev)
    prev->next = entry->next;
else
    list_head = entry->next;
Run Code Online (Sandbox Code Playgroud)

每当我看到这样的代码时,我就会去"这个人不理解指针".而且很遗憾很常见.理解指针的人只使用"指向条目指针的指针",并使用list_head的地址初始化它.然后当他们遍历列表时,他们可以在不使用任何条件的情况下删除条目,只需执行即可

*pp = entry->next
Run Code Online (Sandbox Code Playgroud)

有人可以提供更多解释为什么这种方法更好,以及它如何在没有条件声明的情况下工作?

c pointers linked-list

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

为什么不能用指针接收器实现接口

我很困惑为什么这不能编译:

不可能的类型断言:Faz没有实现Foo(Bar方法有指针接收器)

如果我为Faz.Bar制作Faz.Bar的接收器而不是Faz指针,那么它编译得很好,但我认为拥有指针接收器总是更好,所以值不被复制?

package main

import (
    "log"
)

func main() {
    foo := New().(Faz)
    log.Println(foo)
}

type Foo interface {
    Bar() string
}

func New() Foo {
    return &Faz{}
}

type Faz struct {
}

func (f *Faz) Bar() string {
    return `Bar`
}
Run Code Online (Sandbox Code Playgroud)

pointers interface go

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

C标准是否允许为指针分配任意值并递增它?

这段代码的行为是否定义得很好?

#include <stdio.h>
#include <stdint.h>

int main(void)
{
    void *ptr = (char *)0x01;
    size_t val;

    ptr = (char *)ptr + 1;
    val = (size_t)(uintptr_t)ptr;

    printf("%zu\n", val);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的意思是,我们可以为指针分配一些固定数字,即使它指向某个随机地址也会增加它吗?(我知道你不能取消引用它)

c pointers pointer-arithmetic language-lawyer

52
推荐指数
4
解决办法
5292
查看次数