- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道为什么 inf()
在提供数组且没有格式化选项时成功打印字符数组,但在使用整数数组时编译器会抛出警告并打印垃圾值。
Đây là mã của tôi:
#include
int chính()
{
char cr[3] = { 'a', 'b' };
int ar[3] = { 1, 2 };
printf("character array output using printf() : ");
printf(cr);
printf("\n\nInteger array output using printf() : ");
printf(ar);
printf("\n");
trả về 0;
}
这是我的输出:
../main.c: In function ‘main’:
../main.c:12:4: warning: passing argument 1 of ‘printf’ from incompatible pointer type [enabled by default]
printf(ar);
^
In file included from ../main.c:1:0:
/usr/include/stdio.h:362:12: note: expected ‘const char * restrict’ but argument is of type ‘int *’
extern int printf (const char *__restrict __format, ...);
^
Finished building: ../main.c
1 Câu trả lời
为了回答到底发生了什么,我想首先展示你的数组初始化的作用。您的数组初始值设定项列表不完整,由于大小大于列表而缺少元素。这将导致 zero initialization for the missing elements .
<强>1。 char cr[3]
数组:
char cr[3] = { 'a', 'b' };
将导致:
character represantation == decimal representation
-+----+----+----+----+----+----+- -+----+----+----+----+----+----+-
| | a | b | \0 | | | | | 97 | 98 | 0 | | |
-+----+----+----+----+----+----+- -+----+----+----+----+----+----+-
^~~~ ^~~~
| char | char
cr cr
inf()
函数定义为:int printf( const char* format, ... );
。这意味着它需要一个 char
指针,并且不会更改所指向的元素。
如果您现在将 cr
数组传递给 inf()
chức năng the array name will decay to a pointer . inf()
函数将 định dạng
参数解释为 null terminated character array which is called a C-string 。您的 cr
数组是一个以 null 结尾的 C 字符串,因为它由 { 'a', 'b', '\0' }
组成。这意味着 inf()
函数可以成功地将字符串 "ab"
打印到 stdout。
<强>2。 int ar[3]
数组:
int ar[3] = { 1, 2 };
将导致:
-+----+----+----+----+----+----+-
| | 1 | 2 | 0 | | |
-+----+----+----+----+----+----+-
^~~~
| int
ar
与第一种情况相比,现在您看不出有什么大的区别(只是类型和内容)。但现在您将 ar
数组传递给 inf()
函数。数组名称将衰减为 int*
并隐式转换为 const char*
(这将为您带来编译器警告) )。如果 inf()
函数现在取消引用内存,则如下所示(假设 số nguyên
由 4 个字节组成,并且您的机器使用 little endian memory representation ):
-+----+----+----+----+----+----+----+----+----+----+----+----+----+-
| | 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
-+----+----+----+----+----+----+----+----+----+----+----+----+----+-
^~~~~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~~~~~~ ^~~~~~~~~~~~~~~~~~~
| int int int
^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~ ^~~~
| char char char char char char char char char char char char
ar
它不会打印像 "12"
这样的字符串,而是会消耗两个左边的字符,即十进制值 1 和 0(空终止符),请参见上图。 1 和 0 之后的剩余十进制值无法被识别,因为它们位于空终止符之后。假设您的机器使用 the ASCII table小数点 1 不是可打印字符,会导致打印垃圾值。
概念证明:
为了证明我写的内容,您可以使用以下函数,该函数采用与 inf()
相同的第一个参数,即 const char*
:
void printhexchars(const char* str)
{
while(*str)
{
printf("%03d ", *(str++));
}
/* print last character after while loop: '\0' */
printf("%03d ", *str);
}
此函数打印以 null 结尾的 C 字符串的整数表示形式。请参阅example with your arrays char cr[3]
Và int ar[3]
on ideone.com 。当然,将整数数组传递给上面的函数将生成与之前相同的编译器警告。
Đầu ra:
character array output using printf() : 097 098 000
Integer array output using printf() : 001 000
如您所见,您得到 097 098 000
,它是字符数组的 "ab"
.
您的整数数组导致 001 000
导致十进制值为 1 的不可打印字符。
强>强>
关于c - printf() 无格式字符串打印字符和整数数组 --> 垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46110952/
#include sử dụng không gian tên std; lớp C{ riêng tư: int giá trị; công khai: C(){ giá trị = 0;
Câu hỏi này đã có câu trả lời: Sự khác biệt giữa char a[] = ?string?; và char *p = ?string?;? là gì? (8 câu trả lời) Đã đóng
đóng cửa. Câu hỏi này cần có thông tin chi tiết hoặc rõ ràng. Hiện tại không chấp nhận câu trả lời. Bạn có muốn cải thiện câu hỏi này không? Thêm chi tiết và làm rõ câu hỏi bằng cách chỉnh sửa bài đăng này. Đã đóng 7 năm trước. Bài viết này đã 8 tháng tuổi
Ngoài việc gỡ lỗi, có công cụ kiểm tra nào cho c, c++ hoặc c# hoạt động giống như sao chép và dán một hàm độc lập vào một hộp văn bản nào đó rồi nhập tham số vào các hộp văn bản khác không? Câu trả lời hay nhất Có lẽ bạn sẽ cân nhắc đến thử nghiệm đơn vị. Tôi khuyên bạn nên dùng Google Test và Google Mock
Tôi muốn di chuyển một cửa sổ (HWND) trên màn hình thứ hai. Vấn đề là tôi đã thử nhiều cách như tăng gấp đôi độ phân giải hoặc nhập giá trị âm nhưng nó vẫn không thể đặt cửa sổ trên màn hình thứ hai của tôi. Bất kỳ manh mối nào về cách thực hiện điều này trong C/C++/C# sẽ hữu ích nhất
Tôi đang tìm kiếm các triển khai hiện có của các loại DES khác nhau trong C/C++/C##. Nền tảng hệ điều hành của tôi là Windows XP/Vista/7. Tôi đang cố gắng viết một chương trình C# có thể mã hóa và giải mã bằng thuật toán DES. Tôi cần một số thực sự
Thật khó để biết nên hỏi gì ở đây. Câu hỏi này mơ hồ, không đầy đủ, quá rộng hoặc mang tính tu từ và không thể trả lời hợp lý theo hình thức hiện tại. Để được trợ giúp làm rõ vấn đề này để có thể mở lại, hãy truy cập trung tâm trợ giúp. Đóng 1
Có cách nào để buộc một cửa sổ khác phải ở trên cùng không? Không phải cửa sổ ứng dụng mà là một cửa sổ khác đang chạy trên hệ thống. (Windows, C/C++/C#) Câu trả lời hay nhất: SetWindowPos(that_window_ha
Giả sử bạn được lựa chọn giữa C/C++ hoặc Csharp và bạn dự định chạy nhiều phiên bản của cùng một máy chủ trên cả máy chủ Windows và Linux, thì lựa chọn thông minh nhất để xây dựng ứng dụng máy chủ socket là gì? Câu trả lời tốt nhất là
Bạn có thể cho tôi biết sự khác biệt giữa chúng không? Nhân tiện, có thứ gì được gọi là thư viện C++ hay thư viện C không? Câu trả lời hay nhất: Thư viện chuẩn C++ và Thư viện chuẩn C là các thư viện được định nghĩa bởi các chuẩn C++ và C và được cung cấp để các chương trình C++ và C sử dụng. Đó là những điểm chung của những từ đó
Mã kiểm tra bên dưới, tôi đưa thông tin đầu ra vào phần bình luận. Tôi đang sử dụng gcc 4.8.5 và Centos 7.2. #include #include lớp C { công khai:
Thật khó để biết câu hỏi ở đây là gì. Câu hỏi này mơ hồ, không rõ ràng, không đầy đủ, quá rộng hoặc mang tính tu từ và không thể trả lời hợp lý theo hình thức hiện tại. Để được trợ giúp làm rõ vấn đề này để bạn có thể mở lại, hãy truy cập trung tâm trợ giúp. Đã đóng
Khách hàng của tôi sẽ giao tiếp với khách hàng khác bằng cách sử dụng một cấu trúc/lớp gọi là annoucement. Tôi nghĩ tôi sẽ viết máy chủ bằng C++. Sẽ có nhiều lớp khác nhau kế thừa annoucement. Vấn đề của tôi là gửi các lớp này qua mạng đến máy khách. Tôi nghĩ có lẽ tôi nên sử dụng
Tôi có hàm sau trong C#: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
Tôi có một dự án trong đó tôi phải viết một hàm để làm gì đó với dữ liệu. Tôi có thể viết mã bằng C/C++ nhưng tôi không muốn chia sẻ mã hàm với công ty của mình. Thay vào đó, tôi chỉ muốn trao cho anh ta quyền gọi hàm đó trong mã của riêng anh ta. Có thể được không? Tôi nghĩ đến hai cách tiếp cận -
Tôi đang sử dụng API của bên thứ 3 (C/C++) được viết kém. Tôi sử dụng nó từ mã được quản lý (C++/CLI). Đôi khi có thể xảy ra "Lỗi vi phạm quyền truy cập". Việc này sẽ làm toàn bộ ứng dụng bị sập. Tôi biết tôi không thể xử lý những lỗi này [nếu con trỏ truy cập vào vị trí bộ nhớ bất hợp pháp, v.v.,
đóng cửa. Câu hỏi này không đáp ứng được hướng dẫn của Stack Overflow. Hiện tại câu hỏi này không chấp nhận câu trả lời. Chúng tôi không chấp nhận những câu hỏi tìm kiếm lời khuyên về sách, công cụ, thư viện phần mềm, v.v. Bạn có thể chỉnh sửa câu hỏi để có thể trả lời bằng các sự kiện và trích dẫn. Đã đóng cửa cách đây 7 năm.
Đã đóng. Câu hỏi này không đáp ứng được hướng dẫn của Stack Overflow. Hiện tại không chấp nhận câu trả lời. Các câu hỏi yêu cầu chúng tôi đề xuất hoặc tìm một công cụ, thư viện hoặc tài nguyên ngoài trang web yêu thích là không phù hợp với Stack Overflow vì
Tôi có một số mã C sẽ được gọi từ C# bằng cách sử dụng P/Invoke. Tôi đang cố gắng định nghĩa một hàm C# tương đương cho hàm C này. SomeData* DoSomething(); cấu trúc SomeData {
Câu hỏi này đã có câu trả lời: Tại sao các cấu trúc này lại sử dụng hành vi không xác định trước và sau khi tăng dần? (14 câu trả lời) Đã đóng 6
Tôi là một lập trình viên xuất sắc, rất giỏi!