Tôi đang cố chuyển một chuỗi các chuỗi ký tự (chuỗi kiểu C) vào một hàm. Tuy nhiên, tôi không muốn đặt một kích thước tối đa trên chiều dài của mỗi chuỗi đi vào chức năng, cũng không phải tôi muốn phân bổ các mảng động. Đây là mã tôi đã viết đầu tiên:Chuyển mảng chuỗi ký tự đến hàm
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void fun(char *s[])
{
printf("Entering Fun\n");
printf("s[1]=%s\n",(char *)s[1]);
}
int main(void)
{
char myStrings[2][12];
strcpy(myStrings[0],"7/2/2010");
strcpy(myStrings[1],"hello");
fun(myStrings);
return(0);
}
tôi nhận được một lỗi seg khi chạy và cảnh báo sau đây từ trình biên dịch: stackov.c: Trong chức năng 'chính': stackov.c: 17: cảnh báo: chuyển đối số 1 của 'fun' từ loại con trỏ không tương thích stackov.c: 5: note: expected 'char **' nhưng đối số là kiểu 'char (*) [12]'
Tuy nhiên, khi tôi thay đổi main() đến sau hoạt động:
int main(void)
{
char myStrings[2][12];
char *newStrings[2];
strcpy(myStrings[0],"7/2/2010");
strcpy(myStrings[1],"hello");
newStrings[0]=myStrings[0];
newStrings[1]=myStrings[1];
fun(newStrings);
return(0);
}
Không phải mảng [2] [12] cũng giống như một mảng các con trỏ ký tự khi nó được chuyển đến một hàm?
Điều này có lợi ích là chỉ lưu trữ số lượng ký tự thực tế cần thiết cho các chuỗi. Hạn chế là một con trỏ (bổ sung) cũng được phân bổ cho mỗi chuỗi. Nhưng tính dễ sử dụng của con trỏ là lợi thế chính. –
Có, tôi biết điều này đã làm việc, nhưng đối với ứng dụng thực tế, tôi không thể khởi tạo mảng tại thời gian biên dịch. – Mike
@Mike: Khi bạn sử dụng nó trong một hàm, mảng thực sự được khởi tạo khi chạy. – jpalecek