30/09/2018, 19:44
Bo nho trong lap trinh c
ace cho minh hoi.mình mới học c. trong lập trinh c khi mình chạy gần xong chượng trình thì lệnh goto quay trở ban đầu chuong trình thì bộ nhớ cấp sẽ tạo mới hoàn toàn và vùng nhớ cũ vẫn giữ hay nó sẽ viết tiếp sau vùng bộ nhớ ban đầu với những giá trị của lần chạy sau
Bài liên quan
Mình không hiểu kiến thức về C của bạn đến đâu, nhưng xin đóng góp như sau: ngôn ngữ C cơ bản sử dụng 2 vùng nhớ chính gọi là stack và heap. Hiểu đơn giản stack là vùng nhớ tĩnh, phải khai báo trước và chương trình tự quản lý (tạo, huỷ). Phạm vi của việc tạo, huỷ tuỳ thuộc vào cách bạn khai báo biến, ví dụ như trong hàm, trong toàn chương trình. Còn heap có thể hiểu là vùng nhớ động. Bạn chủ động khai báo (bằng malloc hay new), và chủ động huỷ (bằng free delete). Nếu không huỷ biến trước khi thoát chương trình sẽ có hiện tượng memory leak.
Còn về câu hỏi của bạn, nếu bạn goto đến đoạn mà biến vẫn còn phạm vi tác dụng (chưa bị huỷ tự động hoặc bằng lệnh) thì biến đó vẫn giữ vùng nhớ cũ, nếu không nó sẽ được tạo lại.
thank bạn.mình chỉ tự học được ít nên k hiểu được hết.
đây là chương trình của mình.ban co the xem qua dk k.
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
#define max 1000
typedef struct student;
void info(int *a, int * c, char *b, int i);
struct student
{
int code;
char name[30];
int age;
};
int main()
{
int i = 0, n,d;
FILE *fin;
FILE *fout;
student st[max];
char file[max], file1[max];
HERE:printf(“fill in the information of students:\n”);
printf("\ninput=1,exit=0: “);//decide to continue to fill in
scanf(”%d", &d);
//nhap vao thong tin
if (d == 1)
{
info(&st[i].code, &st[i].age, st[i].name, i);
i++;
system(“cls”);
}
else if (d == 0)
{
printf(“the information is finished.\n”);
system(“cls”);
}
n = i;
//printf(“n=%d”, n);
//check file and write
fin = fopen(“input.txt”, “w”);
fprintf(fin, “-----------------------------------------------”);
fputs("\t\n TABLE OF STUDENT INFORMATION\n", fin);
fprintf(fin, “-----------------------------------------------”);
fprintf(fin, “\n| ST.code | NAME | AGE |\n”);
for (i = 0; i < n; i++)
{
fprintf(fin, “| %-9d|%-25s|%-8d|\n”, st[i].code, st[i].name, st[i].age);
}
fprintf(fin, “-----------------------------------------------\n”);
fclose(fin);
//print out to screen and write it on another file
fin = fopen(“input.txt”, “r”);
fout = fopen(“output.txt”, “w”);
while (fgets(file1, max, fin) != NULL)
{
printf("%s", file1);
fputs(file1, fout);
}
fclose(fout);
fclose(fin);
//choose to continue to add or not
printf(“do you want to add any more students? yes=1, no =0\n”);
scanf("%d", &d);
if (d == 1)
{
goto HERE;
}
getch();
return 0;
}
void info(int *a, int *c, char *b, int i)
{
char tam[3];
printf(“fill in code of student number %d : “, i + 1);
fflush(stdin);
scanf(”%d”, a);
printf("age: "); fflush(stdin);
gets(tam);
*c = atoi(tam);
printf(“name: “);
scanf(”%s”, b);
}
Cụ thể bạn thắc mắc gì với chương trình này?
y minh la neu minh cho no chay dai voi lenh goto kia thi co ton nhieu bo nho k?
vung nho co duoc tao moi va bi lap lai hay k?
.
lệnh goto khi được sử dụng sẽ có các vấn đề nảy sinh, vấn đề đầu tiên là tính an toàn của chương trình sẽ không được bảo đảm vì không rõ là lệnh goto sẽ nhảy đến chỗ gắn cờ nào của bạn… trường hợp tệ nhất nó sẽ nhảy liên tục và lúc đấy thì không thể kể soát việc dùng của nó được -> hạn chế dùng hàm goto…
.
bài này đã được sửa vì sự chưa tìm hiểu rõ về lệnh goto
Cậu đã dịch ngược (decompile) bao giờ chưa mà phán về goto vậy? Ví dụ dịch ngược Delphi -> Assembly, Java -> Java byte code
thì mình nói là trên quản điểm hiểu biết của bản thân mà có gì bạn cứ chỉ giáo thêm rất mong được học hỏi
giờ thì mình biết mình sai ở đâu rồi
.
sau goto không thực hiện khai báo tiếp mà ghi đè lên biến vừa khai báo… ra là vậy, cứ ghi đè rồi lại ghi đè nhưng không khởi tạo lại biến cũ.
.
Bh mình đã hiểu. Cảm on các bạn