Hàm sử dụng lại biến cũ của lần chạy trước đó

Chào mọi người, mình muốn hỏi về cách biến hoạt động trong hàm. Hiện giờ mình có kiểu bigInt với member num là một mảng và một hàm inp() dùng để nhập dãy số vào bigInt.num:

#include <iostream>

struct bigInt {
     int num[100];
};

bigInt inp(std::string s) {
     bigInt n;
     int dem = 0;
     
     for (int i = s.length() - 1; i >= 0; i--) {
          n.num[dem] = s[i] - 48;
          dem++;
     };
     
     std::cout << "Bien n: " << &n << '\n'<< "Bien dem: " << &dem << '\n';
     
     return n;
};

Đây là hàm main():

int main() {
     std::string tam;
     bigInt a, b;
     
     std::cin >> tam;
     a = inp(tam);
     std::cin >> tam;
     b = inp(tam);
     
     return 0;
}

Trong lúc chạy, có một điều bất thường là lần chạy tiếp theo của hàm sử dụng lại dữ liệu của biến của lần chạy trước đó. Khi kiểm tra địa chỉ của các biến thì nó không hề được thay đổi:

123
Bien n: 0x7ffd67f083e0
Bien dem: 0x7ffd67f083b8
456
Bien n: 0x7ffd67f083e0
Bien dem: 0x7ffd67f083b8

Mình có một câu hỏi là tại sao chương trình không xóa đi dữ liệu của biến cục bộ sau khi chạy xong hàm?
Mình cũng mới bắt đầu học C++ nên có thể có sai sót. Mong được mọi người giúp đỡ.

vì nó nhanh. Xóa tốn thời gian xóa nên chậm hơn. Tại sao cần phải xóa?

mà trùng địa chỉ thì có xóa địa chỉ gì đâu :V

Lần 1 chạy hàm, mượn 100 int và 1 int, chương trình cho ở địa chỉ X1 và Y1.
Lần 2 chạy hàm, mượn 100 int và 1 int, chương trình cho ở địa chỉ X2 và Y2.

X1==X2 và Y1==Y2 hay X1 khác X2, Y1 khác Y2 có ảnh hưởng gì tới chương trình đâu :V

2 Likes

Vì mình cần làm hàm cộng trừ nhân chia với kiểu dữ liệu này nữa. Khi mình nhập một số lớn rồi một số nhỏ hơn thì nó sẽ bị ghi đè(Ví dụ như a = 444, b = 5 thì khi return nó sẽ thành a = 444, b = 445)

vậy thì thêm biến int digits vào struct BigInt kia để biết nó có bao nhiêu chữ số :V Còn ko thì phải gán 0 hết khi tạo biến BigInt n mới trong hàm inp():

BigInt inp(std::string s) {
     BigInt n;
     memset(n.num, 0, sizeof(n.num)); // gán 0 hết ở đây :V 
4 Likes

Mình cảm ơn ^^, lúc đầu mình cũng định gán 0 hết lại nhưng mình không biết đến hàm memset().

dùng 1 vòng for gán 0 cũng được mà :V (memset lẹ hơn)

đằng nào cũng phải gán 0, kể cả khi ndem ko dùng lại địa chỉ cũ nha :V Vì qua địa chỉ mới thì n.num ko được gán cho giá trị gì nên 100 int đó mang giá trị bất kì ở địa chỉ đó, ko bảo đảm là 100 số 0 đâu :V

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?