Bài tập liên quan đến con trỏ trong C

Em chào anh/chị

Chuyện là em có viết một hàm đơn giản shorten(char *s1, new_line).
Đại khái là nếu s1 = “hello” có độ dài bằng 5, và new_line bằng 3 thì em phải làm sao để kết quả chỉ còn là “hel”.
Đây là hàm mà em viết, ban đầu em cứ tưởng là hàm viết sai khi cho rằng string không thể thay đổi character bằng cách sử dụng index.
Tuy nhiên lỗi lại ở code em viết trong main.
Dưới đây là phần code đúng em đã viết:

void shorten(char *s1, int new_len)
{
    int strSize = strlen(s1);
    
    if (strSize <= new_len)
    {
        puts("No change");
    }
    else
    {
        s1[new_len] = '\0';
    }

Và đây là phần code main sai khi em sử dụng char *str = “hello” sau đó shorten(str, 3).
Các anh chị có thể cho em hỏi vì sao lại có sự khác nhau như vậy được không?
Và có phải đó là quy định ràng buộc mỗi khi em tạo một biến string thì buộc phải thông qua hàm rồi mới từ con trỏ để trỏ tới nó không.
Em cảm ơn.

Bạn có thể nói chi tiết hơn vấn đề của bạn không?
Lỗi bạn gặp phải là gì?

1 Like

Các trình dịch mới hơn sẽ cảnh báo vì vế phải "hello" nằm trong vùng nhớ hằng, không sửa được.
Hay nói cách khác str đang trỏ vào vùng nhớ hằng.

Nhưng ví dụ sau lại khác:

char buffer[30] = "hello"; // không có const

Đây là cú pháp khai báo + khởi tạo mảng nên không sinh ra hằng chuỗi mới.

4 Likes

Dạ em cảm ơn ạ.
Tức là khi em khai báo:

char *str = “hello”;

sẽ được hiểu là

const char *str = “hello”; //Không thể thay đổi giá trị

Nếu là như vậy tức là khi người khác muốn chạy thử code của em hoặc họ muốn đưa một giá trị vào parameter thì chỉ có hai trường hợp xảy ra: (?)

  1. Dùng mảng character để lưu giá trị, ví dụ char str[] = “hello”;
  2. Vẫn dùng mảng như trên nhưng sẽ dùng con trỏ để lưu tiếp tục, ví dụ char *ptr = str;

Ngoài ra nếu được anh có thể cho em hỏi thêm 1 tí ở phần malloc (liên quan đến bộ nhớ động) được không ạ?
Em mới học nên chỉ thấy malloc khi người ta truyền vào parameter của hàm với giá trị là pointer thì phải.
Em thắc mắc ở đây là họ dùng như vậy vì em không thể tạo ra một biến mới bằng cách:

char *ptr[2] // Không đúng

thay vào đó em phải dùng malloc để làm:

char p = (char)malloc(2)

Và thay vì dùng malloc em vẫn có thể thực hiện bằng cách:

char str[SIZE];
char *ptr = str;

Thì ý em là hai cách đều hoạt động như nhau, nhưng người ta ưu tiên cấp phát bộ nhớ động vì nó gọn hơn hay sao ạ?
Em cảm ơn.

Dạ em cảm ơn.
Tức là em nghĩ em sai ở việc dùng

char *str = “hello”

Sau đó em lại pass str vào trong hàm, bởi vì str kia bản chất là const char * nên em không thể thay đổi (?)

Khi số phần tử có mức tối đa rõ ràng và ít thì mới có thể cấp phát tĩnh được.

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