标签: pointer-arithmetic

共享内存的指针运算

我不明白以下几行到底发生了什么:

  1. unsigned char *membershipChanged = (unsigned char *)sharedMemory;
    
    Run Code Online (Sandbox Code Playgroud)
  2. float *clusters = (float *)(sharedMemory + blockDim.x);
    
    Run Code Online (Sandbox Code Playgroud)

我假设 in #1sharedMemory有效地重命名为membershipChanged,但为什么要将 the 添加blockDimsharedMemory指针中。这个地址指向哪里?

sharedMemory创建于 extern __shared__ char sharedMemory[];


我在CUDA kmeans 实现中找到的代码。

void find_nearest_cluster(int numCoords,
                          int numObjs,
                          int numClusters,
                          float *objects,           //  [numCoords][numObjs]
                          float *deviceClusters,    //  [numCoords][numClusters]
                          int *membership,          //  [numObjs]
                          int *intermediates)
{
extern __shared__ char sharedMemory[];

//  The type chosen for membershipChanged must be large enough to support
//  reductions! There are …
Run Code Online (Sandbox Code Playgroud)

c++ cuda pointer-arithmetic gpu-shared-memory

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

C语言中的指针加减运算错误

现在我有一个像这样的指针算术代码

var1 + sizeof(structA)
Run Code Online (Sandbox Code Playgroud)

Var1是一个指针,structA是一个sizeOf 4字节的结构体。问题是,当我这样做时,地址向下移动 16 个字节而不是 4 个字节。我发现问题是因为在 C 中,即使我输入它实际上是

var1 + sizeof(structA) * sizeof(int)
Run Code Online (Sandbox Code Playgroud)

因为 int 是 sizeof 的返回值。有什么办法可以解决这个问题吗?对于类似的问题,我正在做

var1 - sizeof(structA)
Run Code Online (Sandbox Code Playgroud)

但它不是上移 16 个字节,而是上移 32 个字节,因此 0x10000032 变为 0x10000000。

有谁知道我该如何解决这个问题?

谢谢你!

c pointers pointer-arithmetic

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

对 strlen 在 C 中的工作方式感到困惑

我最近一直在学习C,我遇到了一个strlen的源代码,这真的让我很困惑,我不得不在其他地方查找它,但还不能真正理解它。

斯特伦:

#include <stdio.h>

int strlen(const char *str)
{
    const char* eos = str; // 1

    while (*eos++); // 2

    return (eos - str - 1); // 3
}

int main()
{
    int len = strlen("Hello");

    printf("Len: %d" , len);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么我们使用局部变量 eos 以及为什么我们在空 while 循环中使用它,然后从 strlen 函数返回最后一行?

c c-strings strlen pointer-arithmetic

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

需要解释一个c程序

在我买的一本c-book中,给出了一个练习程序

以下代码段的输出是什么?

printf(3+"Welcome"+2);
Run Code Online (Sandbox Code Playgroud)

我得到的答案是我(在TC++中执行)

但我无法得到实际的机制.请解释一下它背后的实际机制.

c casting pointer-arithmetic

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

关于"this"指针的指针算术

在C++的"this"指针上执行指针运算有什么合法和/或有趣的用途,如果有的话?

为了让SE对这个问题的长度感到满意,我将包含一些相关的代码.

class Foo
{
public:
    Foo(bool terminate = false)
        : _data(terminate ? -1 : 0)
    {}

    void Bar(void)
    {
        if (_data >= 0)
        {
            _data++;
            this[1].Bar();
        }
    }

private:
    int _data;
};

void main()
{
    std::vector<Foo> vec;
    vec.push_back(Foo());
    vec.push_back(Foo());
    vec.push_back(Foo());
    vec.push_back(Foo());
    vec.push_back(Foo(true));

    vec[2].Bar();
}
Run Code Online (Sandbox Code Playgroud)

c++ this pointer-arithmetic this-pointer c++11

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

汇编 - lea和算术

语境:

  • 部件
  • 加油站
  • x86_64的

我的装配有点生疏,我试着让它再次变好.

显示意图的C代码:

void ask_me(int * data){

    (*data)++;

}
Run Code Online (Sandbox Code Playgroud)

这是故意的愚蠢,但适合上下文.

我的工作大会:

_ask_me:
   addq $1, (%rdi)
   ret
Run Code Online (Sandbox Code Playgroud)

题:

我想用这个lea指令作为训练.但我无法使其发挥作用:

_ask_me:
    leaq 1(%rdi), %rdi

    ret
Run Code Online (Sandbox Code Playgroud)

最差:

_ask_me:
    movq (%rdi), %rcx
    leaq 1(%rcx), %rdi

    ret
Run Code Online (Sandbox Code Playgroud)

你能提醒我怎么做吗?

谢谢

assembly x86-64 pointer-arithmetic att

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

这个C++程序会发生什么?

考虑以下计划:

#include <iostream>
int main()
{
    int num=345;
    std::cout<<"num " + num<<'\n';
}
Run Code Online (Sandbox Code Playgroud)

当我运行该程序时,它显示F作为输出.怎么样?是否在这里执行指针运算?如果我使用 - 符号而不是+,则会出现空白输出.

c++ cout pointer-arithmetic

0
推荐指数
3
解决办法
203
查看次数

为什么不是连续数组条目的地址,也是连续的?

我跑的时候

char * a = "string";
char * b = a;
while (*a != '\0')
    printf("%p %c\n", *(a), *(a++));
printf("%p\n", *(b+2));
Run Code Online (Sandbox Code Playgroud)

输出看起来像

0x73 s
0x74 t
0x72 r
0x69 i
0x6e n
0x67 g
0x72
Run Code Online (Sandbox Code Playgroud)

此外,程序如何确定(b + 2)位于0x72.我认为它只会将2添加到b的起始地址,在本例中为0x73.

编辑:这不是未指定行为的情况.正如答案中所解释的那样,我错误地将值传递给地址格式说明符而不是指针本身.

c arrays pointers pointer-arithmetic

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

为什么解引用指向string(char数组)的指针会返回整个字符串而不是第一个字符?

由于指向数组的指针指向数组的第一个元素(具有相同的地址),我不明白为什么会发生这种情况:

#include <stdio.h>

int main(void) {    
    char (*t)[] = {"test text"};
    printf("%s\n", *t + 1); // prints "est text"
}
Run Code Online (Sandbox Code Playgroud)

另外,为什么打印下面的代码2呢?

#include <stdio.h>

int main(void) {    
    char (*t)[] = {1, 2, 3, 4, 5};
    printf("%d\n", *t + 1); // prints "2"
}
Run Code Online (Sandbox Code Playgroud)

c arrays string pointers pointer-arithmetic

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

指向结构数组中连续元素的指针不是均匀偏移?

这是一个重复的问题,但无法在任何地方找到正确的解释.

我有以下代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct student_data_boys
{
    int roll_b;
    char name_b[4];
} student_data_boys;

int main()
{
    student_data_boys *ptr;
    int i;
    int num = 5;
    ptr = (student_data_boys *) malloc(num * sizeof(student_data_boys));
    if(ptr == NULL) 
        printf("Can't allocate memory.\n");
        exit(1);
    }
    printf("Allocated memory space size is : %ld bytes.\n",
         (num * sizeof(student_data_boys)));
    for(i=0;i<num;i++) {
        printf("Start address of data1[%d] is : %p.\n", i+1, ptr+i);
    }
    free(ptr);
}
Run Code Online (Sandbox Code Playgroud)

当我递增结构指针时,预期的下一个地址是基地址加上结构块的大小(这里是8),但是当我看到输出时,下一个大小不是预期的.

产出如下:

Allocated memory space is : 40.
Start address of data1[1] is …
Run Code Online (Sandbox Code Playgroud)

c pointers structure pointer-arithmetic

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