未经许可更改内存的值

时间:2017-02-24 13:07:52

标签: c arrays loops

我有一个2维数组,当我第一次打印数组数据时,日期打印正确,但另一次数组[last] [i]的数据从i = 0到最后 - 1。

显然是一个逻辑错误,但我不明白原因,因为我复制并粘贴了for语句。那么......¿C改变数据?

我使用gcc -std=c99但在此之前我尝试使用C ++和cout语句。

This is the output screenshot

#include <stdio.h>

int main(int argc, char *argv[])
{
  unsigned int numero_jugaderes = 11;
  unsigned int numero = numero_jugaderes - 1;

  unsigned int p_a[numero];

  float p_aya[numero][numero];

  for (unsigned int i = 0; i <= numero; i++) {
    p_a[i] = i;
  }

  for (unsigned int i = 0; i <= numero; i++) {
    for (unsigned int j = 0; j <= numero; j++) {
      p_aya[i][j] = (float) (p_a[i] * p_a[j]) / 100;
      printf("%f\t", p_aya[i][j]);
    }
    puts("");
  }

  puts("\n");

  for (unsigned int i = 0; i <= numero; i++) {
    for (unsigned int j = 0; j <= numero; j++) {
      printf("%f\t", p_aya[i][j]);
    }
    puts("");
  }

  return 0;
}

3 个答案:

答案 0 :(得分:5)

我看到的问题是,你正在循环使用条件检查,如

 for (unsigned int i = 0; i <= numero; i++) 

定义为

的数组
unsigned int p_a[numero];

你要去off-by-one。这实际上是无效的内存访问,它调用undefined behavior

C数组具有基于0的索引,因此有效限制为

for (unsigned int i = 0; i < numero; i++)

答案 1 :(得分:1)

长度数的数组具有数字元素。从索引0到数字1。你正在对待他们就像他们有一个索引值。为i <= numero切换i < numero。对所有for循环和j。

执行相同的操作

答案 2 :(得分:0)

如果您有一个声明为numero个元素的数组,那么索引的有效范围是[0, numero-1]

因此像这样的循环

for (unsigned int i = 0; i <= numero; i++) {

用于访问具有numero元素的数组元素会导致未定义的行为。