我不明白以下几行到底发生了什么:
unsigned char *membershipChanged = (unsigned char *)sharedMemory;
Run Code Online (Sandbox Code Playgroud)
float *clusters = (float *)(sharedMemory + blockDim.x);
Run Code Online (Sandbox Code Playgroud)
我假设 in #1sharedMemory有效地重命名为membershipChanged,但为什么要将 the 添加blockDim到sharedMemory指针中。这个地址指向哪里?
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) 现在我有一个像这样的指针算术代码
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,我遇到了一个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-book中,给出了一个练习程序
以下代码段的输出是什么?
printf(3+"Welcome"+2);
Run Code Online (Sandbox Code Playgroud)
我得到的答案是我(在TC++中执行)
但我无法得到实际的机制.请解释一下它背后的实际机制.
在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代码:
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)
你能提醒我怎么做吗?
谢谢
考虑以下计划:
#include <iostream>
int main()
{
int num=345;
std::cout<<"num " + num<<'\n';
}
Run Code Online (Sandbox Code Playgroud)
当我运行该程序时,它显示F作为输出.怎么样?是否在这里执行指针运算?如果我使用 - 符号而不是+,则会出现空白输出.
我跑的时候
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.
编辑:这不是未指定行为的情况.正如答案中所解释的那样,我错误地将值传递给地址格式说明符而不是指针本身.
由于指向数组的指针指向数组的第一个元素(具有相同的地址),我不明白为什么会发生这种情况:
#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) 这是一个重复的问题,但无法在任何地方找到正确的解释.
我有以下代码:
#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)