Hàm memset(arr, 0, sizeof(arr)) và các "giá trị rác"

#include <stdio.h>
#include <string.h>
int main()
{
    char arr[99];
    // memset(arr, 0, sizeof(arr));
    puts(arr);
    char a[25] = "cdkjnckjsn";
    strcat(arr, a);
    printf("%d", strlen(arr));
    puts(arr);

    return 0;

}

Anh chị có thể giải thích giúp em được không ạ. Em có thử in ra strlen(arr) và thấy rằng lúc không có hàm memset kết quả là 12 còn có memset kết quả lại là 10, tại sao lại như thế ạ?

Khia bạn khai báo char arr[99]; thì arr được cấp 99 ô nhớ bất kì sao cho 99 ô nhớ đó nằm trên vùng chưa có biến/mảng nào dùng đến. Mà bạn nên hiểu rằng các ô nhớ (nằm trên RAM) đâu phải lúc nào cũng có giá trị là 0 đâu. Có thể ô nhớ đó đã được chương trình khác hoặc 1 biến/mảng khác trong cùng chương trình dùng qua. Sau khi hủy biến thì dữ liệu vẫn còn đó. Thế nên mới có cái gọi là “giá trị rác”.
Để đưa tất cả giá trị về 0 thì dùng memset() với tham số thứ 2 là giá trị của các ô nhớ.

Còn vì sao 12 và 10 vì các “giá trị rác” đã chiếm thêm 2 ô nhớ đầu tiên nên chuỗi 10 kí tự chép qua sẽ thành 12. Có thể thay đổi khác với những lần chạy tiếp theo.

2 Likes

Em cảm ơn a, nhưng em thấy thắc mắc tại sao lúc memset(arr, 0, sizeof(arr)) rồi sau đó puts(arr); thì lại không thấy in ra cái gì. Em nghĩ 0 cũng là một giá trị thì mình phải in ra gì đó chứ?
Em có thấy một anh giải thích trên đó thì nếu mình memset(arr, 0, sizeof(arr)) chuỗi này char arr[5] = {'a', 'b', 'c', 'd', '\0'}; thì nó sẽ thành arr[5] = {'\0', '\0', '\0', '\0', '\0'} như thế ạ?

trong C chuỗi mặc định kết thúc bằng giá trị 0 (tương ứng với ký tự ‘\0’) nên mảng chuỗi toàn giá trị 0 coi như kết thúc ở index 0 rồi nên C nó hiểu đó là chuỗi rỗng :V

{'\0', '\0', '\0', '\0', '\0'} là chuỗi rỗng
{'\0', 'a', '\0', '\0', '\0'} cũng là chuỗi rỗng
{'\0', 'a', 'b', 'c', 'd'} cũng là chuỗi rỗng
{'a', 'a', '\0', '\0', 'a'} là chuỗi có 2 ký tự “aa”

3 Likes

Thế liệu em hiểu như này có đúng không ạ?

1 Like

ừ đúng :V

20 character :V

3 Likes

Thank you so much

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