struct return error-C - PullRequest
       33

struct return error-C

1 голос
/ 16 марта 2011

эта программа написана на C

, она должна получить массив из двух D (matrixAdd) и сканировать его с помощью scanMtx (функция сканирования здесь отсутствует, потому что код не имеет значения)

проблема: функция EDMtx возвращает матрицу сканирования 1,1,1, 1, -8,1,, 1,1,1, когда она возвращается к основному значению: 0,0,0,0,0,0, барахло, барахло, барахло

кажется, что есть ошибка адреса

что я сделал не так?

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

struct matrix
{
    int* ptr;
    int row;
    int column;
};

matrix EDMtx();

void main( int argc, char* argv[])
{
    int matrixAdd[5][5]={{1,1,1,3,4},{1,1,1,3,4},{1,1,1,3,4},{1,1,1,3,4},{1,1,1,3,4}};
    matrix mtx;
    matrix scanMtx;

    mtx.ptr=&matrixAdd[0][0];
    mtx.row=5;
    mtx.column=5;

    scanMtx= EDMtx();

//  mtx= ScanM(mtx,1,1,scanMtx);- doesn't important to you.

    getchar();
}
matrix EDMtx()

{

    int matrx[3][3]={{1,1,1},{1,-8,1},{1,1,1}};
    matrix Mtx;

    Mtx.ptr=&matrx[0][0];
    Mtx.row=3;
    Mtx.column=3;

    return Mtx;
}

Ответы [ 3 ]

0 голосов
/ 16 марта 2011

В EDMtx Mtx.ptr указывает на переменную стека.Это разрушается, вероятно.Если вы хотите обменять указатели на переменные, они должны быть в куче

0 голосов
/ 16 марта 2011
matrix EDMtx()
{

    int matrx[3][3]={{1,1,1},{1,-8,1},{1,1,1}};

    matrix Mtx;
    Mtx.ptr=&matrx[0][0];
    Mtx.row=3;
    Mtx.column=3;

    return Mtx;

}

matrx является локальной переменной.Таким образом, он выходит за рамки, когда по возвращении EDMtx()Mtx.ptr имеет ссылку на локальную переменную matrx.И поэтому член-указатель scnMtx получает значения мусора при разыменовании. Никогда не возвращать ссылки на локальную переменную.

0 голосов
/ 16 марта 2011

Переменные matrixAdd и matrx и память, на которую они указывают, имеют только локальную область видимости. Если вы хотите, чтобы они сохранялись после возвращения из функции, объявите их static или измените логику кода. (например, используя malloc для явного выделения памяти)

...