01/10/2018, 08:24
Cách thức hoạt động function strcpy trong C
Code 1 của mình thế này:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char string[] = "Hello", copy[10]= {0};
strcpy(string,copy);
printf("string is: %s
",string);
printf("copy is: %s
",copy);
return 0;
}
và Code2 thế này:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
char string[] = "Hello", copy[10]= {0};
strcpy(copy,string);
printf("string is: %s
",string);
printf("copy is: %s
",copy);
return 0;
}
2 Code chỉ khác nhau ở strcpy(string,copy) và strcpy(copy,string) thôi
Nhưng khi Build ra thì strcpy(copy,string) sẽ cho ra kết quả của việc copy trên còn strcpy(string,copy) thì lại không hiển thị kết quả.
Các bạn giải thích giúp mình vì sao lại vây với nhe
Bài liên quan
Bạn xem các tham số của hàm strcpy là hiểu
http://en.cppreference.com/w/cpp/string/byte/strcpy
trước hết mình xin ĐOÁN cách thức hàm strcpy hoạt động(vì hàm này rất khó xem mã nguồn, MinGW dấu kĩ quá)
void strcpy(char *des,const char *source){
int i=0;
while(!source[i] && !des[i]){
des[i] = source[i]
}
}
thứ 2, do biến string hiện thời đang trỏ đến vùng nhớ tức thời, được xem là hằng, giá trị vùng nhớ này không thể tự tiện thay đổi được nên khi bạn dùng hàm strcpy(string,copy) thì khi đó bạn đã thay đổi giá trị vùng nhớ này và dẫn đến phát sinh lỗi (cái này được gọi là Undefined behavior vì tùy từng trình biên dịch mà nó có các cách thể hiện lỗi khác nhau)
thứ 3, biến copy là mảng cấp phát tĩnh, lấy dữ liệu từ stack segment giá trị của nó có thể thay đổi được
Mảng
string
không phải là string literal nhé còn không hiện ra ở trường hợp 2 docopy
ban đầu được gán là""
rồi thì nó không hiện là phảiCảm ơn các bạn đã góp thêm chút thông tin mình sẽ lấy nó tìm hiểu thêm
cái này nó được định nghĩa tức thời và MinGW xem nó như là hằng luôn, cho nên không thể thay đổi được nó. Cái này như mình đã nói trước là nó thuộc về Undefined behavior, mỗi trình biên dịch sẽ có cách xử lý khác nhau đó
ok cảm ơn bạn mình hiểu sơ sơ rồi
Cái đó là câu này này:
char* string = "Hello"
Còn bài này không phải thì bạn phải dẫn chứng mục mấy điểm nào trang bao nhiêu trong C99 ghi như vậy là undefined behavior.
Undefined behavior |
The major forms of undefined behavior in C can be broadly classified as : spatial memory safety violations, temporal memory safety violations, integer overflow, strict aliasing violations, alignment violations, unsequenced modifications, data races, and loops that neither perform I/O nor terminate. In C the use of any automatic variable before it has been initialized yields undefined behavior, as does integer division by zero, signed integer overflow, indexing an array outside of its defined bou...
Đoạn code đầu trong Wiki thì cơ bản rồi, đang nói về khẳng định này đây:[quote=“MrEZ, post:6, topic:41821”]
cái này nó được định nghĩa tức thời và MinGW xem nó như là hằng luôn, cho nên không thể thay đổi được nó.
[/quote]
về tính chất của
char string[] = "Hello"
nhé.ko hiểu ý bạn nói cho lắm, cơ mà sao có thể lấy trích dẫn được vậy bạn?