标签: pointers

取消引用指针会复制它吗?

是否取消引用指针并将其传递给通过引用获取其参数的函数会创建该对象的副本?

c++ pointers dereference

35
推荐指数
3
解决办法
1万
查看次数

memcpy vs for循环 - 从指针复制数组的正确方法是什么?

我有一个foo(int[] nums)我理解的功能基本上相当于foo(int* nums).在里面foo我需要将指向的数组的内容复制nums到一些int[10]声明的范围内foo.我理解以下内容无效:

void foo (int[] nums) 
{
    myGlobalArray = *nums
}
Run Code Online (Sandbox Code Playgroud)

复制数组的正确方法是什么?我应该像这样使用memcpy:

void foo (int[] nums)
{
    memcpy(&myGlobalArray, nums, 10);
}
Run Code Online (Sandbox Code Playgroud)

或者我应该使用for循环?

void foo(int[] nums)
{
    for(int i =0; i < 10; i++)
    {
        myGlobalArray[i] = nums[i];
    }
}
Run Code Online (Sandbox Code Playgroud)

我缺少第三种选择吗?

c++ arrays pointers copy

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

C++将数组指针作为函数参数传递

我正在尝试使用数组指针作为生成数组的函数的参数.

void generateArray(int *a[],  int *si){
  srand(time(0));
  for (int j=0;j<*si;j++)
       *a[j]=(0+rand()%9);
} //end generateArray;

int main() {
  const int size=5;
  int a[size];

  generateArray(&a, &size);

  return 0;
} //end main
Run Code Online (Sandbox Code Playgroud)

但是当我编译它时,会出现以下消息:

cannot convert `int (*)[5]' to `int**' for argument `1' to `void generateArray(int**, int*)'
Run Code Online (Sandbox Code Playgroud)

c++ arrays pointers function

35
推荐指数
3
解决办法
13万
查看次数

只要你没有取消引用它,是否可以很好地定义一个未对齐的指针?

我有一些C代码可以解析来自网络的打包/未打包二进制数据.

这段代码在Intel/x86下运行正常,但是当我在ARM下编译它时,它经常会崩溃.

正如您可能已经猜到的那样,罪魁祸首是未对齐的指针 - 特别是,解析代码会做出如下问题:

uint8_t buf[2048];
[... code to read some data into buf...]
int32_t nextWord = *((int32_t *) &buf[5]);  // misaligned access -- can crash under ARM!
Run Code Online (Sandbox Code Playgroud)

......显然不会在ARM-land中飞行,所以我修改它看起来更像这样:

uint8_t buf[2048];
[... code to read some data into buf...]
int32_t * pNextWord = (int32_t *) &buf[5];
int32 nextWord;
memcpy(&nextWord, pNextWord, sizeof(nextWord));  // slower but ARM-safe
Run Code Online (Sandbox Code Playgroud)

我的问题(从语言 - 律师的角度来看)是:我的"ARM修复"方法是否在C语言规则下定义明确?

我担心的是,即使只是有一个misaligned-int32_t指针也可能足以调用未定义的行为,即使我从来没有直接取消引用它.(如果我关心的是有效的,我想我可以修复通过改变问题pNextWord从的类型(const int32_t *)(const char *)的,但我宁愿不这样做,除非它实际上必须这样做,因为这将意味着做手工一些指针跨度计算)

c pointers alignment language-lawyer

35
推荐指数
3
解决办法
1914
查看次数

指针比较在 C 中如何工作?可以比较不指向同一个数组的指针吗?

在 K&R(C 编程语言第 2 版)第 5 章中,我阅读了以下内容:

首先,在某些情况下可以比较指针。如果pq指向同一个数组的成员,则关系一样==!=<>=,等正常工作。

这似乎意味着只能比较指向同一数组的指针。

但是,当我尝试此代码时

    char t = 't';
    char *pt = &t;
    char x = 'x';
    char *px = &x;

    printf("%d\n", pt > px);
Run Code Online (Sandbox Code Playgroud)

1 被打印到屏幕上。

首先,我认为我会得到 undefined 或某种类型或错误,因为ptpx没有指向同一个数组(至少在我的理解中)。

也是pt > px因为两个指针都指向存储在栈上的变量,栈向下增长,所以内存地址t大于x?为什么pt > px是真的?

当 malloc 被引入时,我变得更加困惑。 同样在第 8.7 章的 K&R 中写到以下内容:

然而,仍然存在一种假设,即sbrk可以有意义地比较指向由 返回的不同块的指针。仅允许在数组内进行指针比较的标准并不能保证这一点。因此,这个版本的malloc仅在一般指针比较有意义的机器之间是可移植的。

将指向堆上 malloced …

c pointers heap-memory memory-layout undefined-behavior

35
推荐指数
3
解决办法
5731
查看次数

字符数组的文字字符串初始值设定项

在以下规则中,当数组衰减到指针时:

左值[见2.5问题]型阵列的-T出现在表达衰变(有三个例外)转换成一个指向它的第一个元素的; 结果指针的类型是指向T的指针.

(例外情况是,当阵列是的sizeof或&运算符的操作数,或为字符数组一个文本字符串初始化.)

如何理解数组是"字符数组的文字字符串初始值设定项"的情况?请举个例子.

谢谢!

c arrays string pointers c99

34
推荐指数
3
解决办法
9740
查看次数

从C中的函数返回局部变量

#include <stdio.h>

int foo1(void)
{
    int p;
    p = 99;
    return p;
}

char *foo2(void)
{
    char buffer[] = "test_123";
    return buffer;
}

int *foo3(void)
{
    int t[3] = {1,2,3};
    return t;
}

int main(void)
{
    int *p;
    char *s;

    printf("foo1: %d\n", foo1());
    printf("foo2: %s\n", foo2());
    printf("foo3: %d, %d, %d\n", p[0], p[1], p[2]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我编译它时gcc -ansi -pedantic -W -Wall,编译器会发出foo2()和foo3()的警告消息:

warning: function returns address of local variable
Run Code Online (Sandbox Code Playgroud)

我认为不允许返回局部变量,但foo1()工作正常,似乎返回指向本地对象的指针和对象本身之间存在巨大差异.

任何人都能对这个问题有所了解吗?提前致谢!

c pointers local-variables

34
推荐指数
3
解决办法
4万
查看次数

将void指针增加一个字节?两个?

我有一个名为的void指针ptr.我想将这个值增加几个字节.有没有办法做到这一点?

请注意,我想在不创建任何更多变量的情况下就地执行此操作.

我能做点什么ptr = (void *)(++((char *) ptr));吗?

c c++ pointers

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

不是double [] []相当于**double?

我问这个是因为我的程序有两个函数来乘法矩阵,它们只乘以4x4和4x1矩阵.标题是:

 double** mult4x1(double **m1, double **m2);
 double** mult4x4(double **m1, double **m2);
Run Code Online (Sandbox Code Playgroud)

它们执行m1*m2并将其返回**两倍,下面是4x4乘法的片段.

 double** mult4x4(double **m1, double **m2){
      double** result = (double**) malloc(sizeof(double)*4);
      for (int i = 0; i < 4; i++) {
           result[i] = (double*) malloc(sizeof(double)*4);
      }
      ...multiply...
      return result;
 }
Run Code Online (Sandbox Code Playgroud)

mult4x1和mult4x4之间的区别仅在于它们内部使用的索引.

我有这3个矩阵:

double m1[4][4] = {
    {2, 3, 5, 6},
    {9, 8, 1, 7},
    {5, 4, 3, 1},
    {7, 6, 1, 2}
};

double m2[4][4] = {
    {1, 0, 0, 0},
    {0, 1, 0, 0},
    {0, 0, 1, 0}, …
Run Code Online (Sandbox Code Playgroud)

c++ pointers matrix multidimensional-array

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

struct结尾处的大小为0的数组

我今天接受系统编程课程的教授告诉我们,最后定义一个零长度数组的结构:

struct array{
    size_t size;
    int data[0];
};

typedef struct array array;
Run Code Online (Sandbox Code Playgroud)

这是一个有用的结构,用于定义或初始化带有变量的数组,即如下所示:

array *array_new(size_t size){
    array* a = malloc(sizeof(array) + size * sizeof(int));

    if(a){
        a->size = size;
    }

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

也就是说,使用malloc(),我们还为大小为零的数组分配内存.这对我来说是全新的,而且看起来很奇怪,因为从我的理解来看,结构不必在连续的位置上有它们的元素.

为什么代码在array_new内存中分配data[0]?那么,为什么要访问它是合法的

array * a = array_new(3);
a->data[1] = 12;
Run Code Online (Sandbox Code Playgroud)

从他告诉我们的内容来看,似乎在结构的末尾定义为长度为零的数组确保在结构的最后一个元素之后立即出现,但这看起来很奇怪,因为再次,根据我的理解,结构可能有填充.

我也看到这只是gcc的一个特性,并没有任何标准定义.这是真的?

c arrays gcc struct pointers

34
推荐指数
3
解决办法
9438
查看次数