2017-02-24 37 views
-1

我有一个2维的数组,并且当我第一次打印数组的数据时,日期打印正确,但其他时间的数组[数组] [数据]来自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; 
} 
+0

即在技术上是不是一个有效的C++程序,由于C++没有[可变长度数组(https://en.wikipedia.org/wiki/Variable-length_array)。 –

+0

@user我想这是相反的 –

+0

至于你的问题,请记住,X元素的数组,具有有效的索引范围'0'到'X - 1'(含)。现在仔细看看你的循环。 –

回答

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++) 
0

如果有一个数组声明为具有numero元件然后指数的有效范围是[0, numero-1]

因此这样的环这样

for (unsigned int i = 0; i <= numero; i++) { 
用于访问数组元素与未定义行为 numero元件结果

1

长度数字的数组有数字元素。从索引0到数字1。你正在对待他们,就像他们有索引数字。换成i <= numeroi < numero。对所有循环和j使用相同的操作。