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\n",string);
    printf("copy is: %s\n",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\n",string);
    printf("copy is: %s\n",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 :smiley:

Bạn xem các tham số của hàm strcpy là hiểu

http://en.cppreference.com/w/cpp/string/byte/strcpy

2 Likes

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é :smiley: còn không hiện ra ở trường hợp 2 do copy ban đầu được gán là "" rồi thì nó không hiện là phải :slight_smile:

1 Like

Cảm ơn các bạn đã góp thêm chút thông tin :smiley: 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 :smiley: 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.

1 Like

Đoạn code đầu trong Wiki thì cơ bản rồi, đang nói về khẳng định này đây:

về tính chất của char string[] = "Hello" nhé.

1 Like

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?

Khác nhau ở chỗ: *string là một con trỏ đến vùng nhớ hằng (trong phần .code, không được sửa), còn char string[] là một vùng nhớ (trên stack).

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