Đúng, thời gian tồn tại của một biến cục bộ nằm trong phạm vi ( {
, }
) mà nó được tạo.
Biến cục bộ có lưu trữ tự động hoặc cục bộ. Tự động vì chúng tự động bị hủy khi phạm vi mà chúng được tạo kết thúc.
Tuy nhiên, những gì bạn có ở đây là một chuỗi ký tự, được cấp phát trong một bộ nhớ chỉ đọc được xác định thực thi. Các ký tự chuỗi khác với các biến cục bộ và chúng vẫn tồn tại trong suốt vòng đời của chương trình. Chúng có thời lượng tĩnh [Tham chiếu 1] .
Một lời cảnh báo!
Tuy nhiên, lưu ý rằng bất kỳ nỗ lực nào để sửa đổi nội dung của một chuỗi ký tự là một hành vi không xác định (UB). Chương trình người dùng không được phép sửa đổi nội dung của một chuỗi ký tự.
Do đó, nó luôn được khuyến khích sử dụng const
trong khi khai báo một chuỗi ký tự.
const char*p = "string";
thay vì,
char*p = "string";
Trên thực tế, trong C ++, việc khai báo một chuỗi ký tự mà không có ký tự const
mặc dù không có trong C. Tuy nhiên, khai báo một chuỗi ký tự với a const
mang lại cho bạn lợi thế là các trình biên dịch thường đưa ra cảnh báo cho bạn trong trường hợp bạn cố gắng sửa đổi chuỗi ký tự trong trường hợp thứ hai.
Chương trình mẫu :
#include<string.h>
int main()
{
char *str1 = "string Literal";
const char *str2 = "string Literal";
char source[]="Sample string";
strcpy(str1,source);
strcpy(str2,source);
return 0;
}
Đầu ra:
cc1: cảnh báo được coi là lỗi
prog.c: Trong hàm 'main':
prog.c: 9: error: truyền đối số 1 của 'strcpy' loại bỏ các định nghĩa khỏi loại đích con trỏ
Lưu ý rằng trình biên dịch cảnh báo cho trường hợp thứ hai, nhưng không cảnh báo cho trường hợp đầu tiên.
Để trả lời câu hỏi đang được hỏi bởi một vài người dùng tại đây:
Đối phó với các ký tự tích phân là gì?
Nói cách khác, đoạn mã sau có hợp lệ không?
int *foo()
{
return &(2);
}
Câu trả lời là, không mã này không hợp lệ. Nó không hợp lệ và sẽ gây ra lỗi trình biên dịch.
Cái gì đó như:
prog.c:3: error: lvalue required as unary ‘&’ operand
Các ký tự chuỗi là giá trị l, nghĩa là: Bạn có thể lấy địa chỉ của một ký tự chuỗi, nhưng không thể thay đổi nội dung của nó.
Tuy nhiên, bất kỳ literals khác ( int
, float
, char
, vv) là r-giá trị (tiêu chuẩn C sử dụng thuật ngữ giá trị của một biểu thức cho các) và địa chỉ của họ không thể được thực hiện ở tất cả.
[Tham khảo 1] Tiêu chuẩn C99 6.4.5 / 5 "Chữ viết chuỗi - Ngữ nghĩa":
Trong giai đoạn dịch 7, một byte hoặc mã có giá trị 0 được nối vào mỗi chuỗi ký tự đa byte là kết quả của một chuỗi ký tự hoặc ký tự. Sau đó, chuỗi ký tự multibyte được sử dụng để khởi tạo một mảng lưu trữ tĩnh và độ dài vừa đủ để chứa chuỗi . Đối với các ký tự chuỗi ký tự, các phần tử mảng có kiểu char, và được khởi tạo bằng các byte riêng lẻ của chuỗi ký tự nhiều byte; đối với các ký tự chuỗi rộng, các phần tử mảng có kiểu wchar_t và được khởi tạo bằng chuỗi các ký tự rộng ...
Không xác định được liệu các mảng này có khác biệt hay không miễn là các phần tử của chúng có giá trị thích hợp. Nếu chương trình cố gắng sửa đổi một mảng như vậy, hành vi là không xác định .
int rc
. Thời gian tồn tại của nó kết thúc ở mỗi dấureturn
-s. Các con trỏ bạn đang trả về là các ký tự chuỗi. Các chuỗi ký tự có thời lượng lưu trữ tĩnh: thời gian tồn tại của chúng ít nhất bằng thời gian của chương trình.