用指针/数组差异赋值

时间:2018-07-16 19:18:36

标签: c arrays pointers

作为C的初学者,我仍然对神奇的“指针”概念感到困惑

例如,这是一个简单的代码,可以在数组“ range1”中存储1到10个

int *range1;
int max = 10;
int count = 0;
range1 = malloc(sizeof(int) * (11));
while (count < max)
{
    range1[count] = count;
    count++;
}
range1[count] = '\0';

这很好,但是

int *range1;
int max = 10;
int count = 0;
range1 = malloc(sizeof(int) * (11));
while (count < max)
{
    *range1 = count;
    count++;
    range1++;
} 
range1[count] = '\0';

这不是。我得到

[1]    24934 segmentation fault

我很困惑,因为我以为*(range1 + count)= range1 [count]。

如何更改第二个示例,使其运行而不会产生细分冲突。

2 个答案:

答案 0 :(得分:7)

使用

range1++;
不建议使用

,除非您有另一个变量存储malloc返回的值。没有这样的变量,您将丢失原始指针。呼叫free将是一个问题。

此外,如果您继续使用

range1[11] = '\0';

循环后,您正在访问和修改不应在内存中的位置。这会导致不确定的行为。

PS

的使用
range1[11] = '\0';
即使使用第一种访问range1元素的方法,

也是一个问题。分配11个元素时,10是最高有效索引。

答案 1 :(得分:1)

我的猜测是,您尝试在将range1递增后使用它。您应该保留原始指针的副本以打印数组并释放内存。

请参见下面的代码,内嵌注释:

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

int
main(void)
{
  int *range1, *range2;
  int max = 10;
  int count = 0;

  range1 = malloc(sizeof(int) * 11);
  range2 = range1;


  printf("\nstart Test 1 -- array\n");
  while (count < max)
  {
      range1[count] = count;
      count++;
  }
  range1[10] = '\0'; // index 11 is out of bounds
  // Also this is not something you'd usually do in with an array of integers.
  // It is commonly done with character arrays representing strings because
  // strings are NUL terminated.

  for(int i=0; i < max; i++) {
    printf("%d: %d\n", i, range1[i]);
  }

  printf("\nstart Test 2 -- ptr incr\n");

  range2 = range1; // need to work with a copy and keep range 1 to print and free memory

  while (count < max)
  {
    *range2 = count;
    count++;
    range2++;
  } 

  for(int i=0; i < max; i++) {
    printf("%d: %d\n", i, range1[i]);
  }
  free(range1);
}

输出:

start Test 1 -- array
0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9

start Test 2 -- ptr incr
0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9