Tag: 指针算术

在MPI_Gather C中寻址内存

我正在尝试将数据传递给MPI_Gather 。 我按如下方式分配内存: float *phie, *phitemp; MPI_Comm_size(MPI_COMM_WORLD, &size); MPI_Comm_rank(MPI_COMM_WORLD, &rank); phitemp=(float *) malloc(20*sizeof(float)); if (rank==1) phie=(float *) malloc(itermax*20*size*sizeof(float)); 然后让所有进程使用MPI_Gather()将数据发送到排名1,如下所示: for (iter=0;iter<itermax;iter++) { MPI_Gather((float *) phitemp, 20, MPI_FLOAT, (float *) (phie+iter*20*size*sizeof(float)), 20, MPI_FLOAT, 1, MPI_COMM_WORLD); iter=0; } 我收到错误消息表明我没有正确分配内存。

c和objective-c – const char *和char *

我有一个function: -(void)ADPCMDecode:(char *)indata : (short *)outdata :(long)len { indata是一个char,函数做指针算术迭代一段len,修改outdata,这是一个简短的,我需要做指针运算来从中获取值。 我试图使用以下方法调用该函数: const char *modulatedBytes1 = [modulatedAudio bytes]; char *modulatedBytes [] = modulatedBytes1; unsigned int moduleatedLength = [modulatedAudio length]; short *decompressedBytes = NULL; [self ADPCMDecode:modulatedBytes :decompressedBytes :moduleatedLength]; DLog(@”%hi”,decompressedBytes[1]); 我在这一行得到了一个BAD ACCESS错误: *outp++ = valprev; 在函数内,因为我传递一个constant char *而不是char * 我应该如何调用该函数,以及如何从中获取输出? 我没有C的背景,这就是为什么我不明白如何去做这个。 以下是同一问题的C唯一版本: https : //pastee.org/d3y3z

-Wpedantic错误类型参数在转换后递增

我有一个代码 while (n–) { *((char*)dest++) = *((char*)src++); } 其中dest和src是void指针, n是一个大小。 目标是重新实现memcpyfunction。 当用gcc编译这个代码时,一切都很好,但是当我添加-Wpedantic标志时,我有四个警告“错误的类型参数来增加”。 Google告诉我,当尝试在void指针上使用算法时会发生这种情况,因为在这种情况下gcc将void类型视为1字节类型,但遗留编译器不应该这样做。 然后我必须将指针强制转换为char指针但是你可以看到我已经做到了! 任何的想法?

C中的数组赋值使用指针算法

当我使用指针算法访问特定元素时,如何更改数组中的值? #include int main() { int a[3] = {1, 1, 1}, b[3] = {2, 2, 2}; a++ = b++; // How can I get this to work so a[1] = b[1]? return 0; }

是否保证C中的数组元素将连续存储,没有填充?

换句话说:如果我有这样分配的数组,它是否可以保证: void *arr = calloc(nmemb, sizeof(some_type)) 那么elta , eltb , eltc都将指向内存中的相同位置,这将是此数组some_type类型的第二个元素? some_type *elta = &((some_type*)arr)[1]; some_type *eltb = ((some_type*)arr)+1; some_type *eltc = (char*)arr+sizeof(some_type); 我问这个的原因是因为我试图在C中做一个“容器”,如果这不成立,那么我就没有想法如何返回指向除第一个之外的任何其他元素的指针。

如何应用结构偏移?

我有一个结构 typedef struct foo { int lengthOfArray1; int lengthOfArray2; int* array1; int* array2; } foo; 我需要为整个结构及其数组的内容分配足够的内存。 假设每个arrays的长度为5 …… foo* bar = (foo*)malloc(sizeof(foo) + (sizeof(int) * 5) + (sizeof(int) * 5)); 我现在必须将array1和array2指向该分配缓冲区中的正确位置: bar->array1 = (int*)(&bar->lengthOfArray2 + sizeof(int)); bar->array2 = (int*)(bar->array1 + lengthOfArray2); 它是否正确? 编辑#1 只是为了消除任何困惑:我试图将内存保留在一个块中,而不是三个。 编辑#2 我不能使用C99,因为MSVC 2010编译器不支持它(http://stackoverflow.com/questions/6688895/does-microsoft-visual-studio-2010-supports-c99)。

指针算术的问题 – 尝试标记输入字符串

目前我正在开发一个程序,允许用户输入一个字符串然后进行标记化,然后使用指针数组将标记打印到屏幕上。 通过调用我的tokenize函数来“执行”这个操作,该函数读取输入字符串直到第一个分隔符(”,’,’,’。’,’?’,’!’)。 然后它将我的字符串中的分隔符更改为NULL char。 然后它应该返回一个指向我的字符串中的下一个字符的指针。 在输入字符串之后的main中,它应该继续调用tokenize函数,该函数返回指针,然后存储在指针数组中以便稍后打印我的标记。 一旦tokenize()返回一个指向NULL字符的指针,该字符位于我的字符串的末尾,它就会从该循环中断开。 然后我使用我的指针数组打印出令牌。 //试图详细说明 #include #include char *tokenize ( char *text, const char *separators ); int main ( void ) { char text[30]; char separators[6] = { ‘ ‘,’.’,’,’,’?’,’!’,’\0′}; char *pch = NULL; int tokens[15]; int i = 0; int j = 0; printf(“Enter a string: \n”); fgets( text, 30, […]

什么时候指针减法在C中未定义?

char *buf = malloc(bufsize) char *ptr = buf; … while(condition) { ptrdiff_t offset = ptr – buf; // bufsize) { // we need more room bufsize += 128; buf = realloc(buf, bufsize); ptr = buf + offset; // buf might be in a completely new location } *ptr++ = … // write this byte } […]

为什么scanf(“%s”,&str); 表现为scanf(“%s”,str);?

看下面的代码: #include int main() { char str[80]; int n; scanf(“%s%n”,str,&n); printf(“%s\t%d”,str,n); putchar(‘\n’); getchar(); //to remove ‘\n’ scanf(“%s%n”,&str,&n); printf(“%s\t%d”,str,n); return 0; } 这是输入和输出: abc abc 3 123 123 3 我们知道, scanf是一个可变参数函数,因此在调用它时它的参数不会被强制转换。 因此,参数必须以与它们应该完全相同的类型传递。 但是, str的类型是char * (从char (*)[80]衰减),而&str的类型为char (*)[80] ,尽管它们具有相同的值 ,即&str[0] 。 那么为什么scanf(“%s”,&str); 正确工作而不会因指针运算而导致段错误?

指向数组的指针和指针指针有什么区别?

我是编程和学习数组指针的新手。 我现在有点困惑。 看看下面的程序: #include int fun(); int main() { int num[3][3]={23,32,478,55,0,56,25,13, 80}; printf(“%d\n”,*(*(num+0)+1)); fun(num); printf(“%d\n”, *(*(num+0)+1)); *(*(num+0)+0)=23; printf(“%d\n”,*(*(num+0))); return 0; } int fun(*p) // Compilation error { *(p+0)=0; return 0; } 这是我老师的笔记中写的程序。 在main()函数中,在printf()函数中,dereference运算符被使用了两次,因为num是指向数组的指针,因此第一次取消引用运算符将​​指向int ,然后第二个将给出指针所在的值指向。 我的问题是,当我将数组名称作为参数传递给函数fun()为什么使用*p ; 为什么不**p作为num是指向数组的指针? 第二件事为什么*(p+0)用于改变数组的第0个元素的值; 为什么不*(*(p+0)+0)=0因为main()函数*(*(num+0)+0)用于改变第0个元素的值? 整件事对我来说很困惑,但无论如何我必须要理解它。 我已经搜索了这个,发现指向数组的指针和指向指针之间有区别,但我无法理解。