*a[]
为什么小于17的数,下边的 printf 都不显示东西呢,大于17就可以 贴代码 人造人 发表于 2018-2-24 13:03贴代码
#include <stdio.h>
typedef unsigned char uint8_t;
int main(void)
{
uint8_t *a; // 这里为什么是 17 呢?小于17的数都不行
printf("%d, %d, %d, %d\n", sizeof(a), sizeof(*a), sizeof(uint8_t), sizeof((uint8_t *)"00000000"));
*a = (uint8_t *)"00000000";
*(a+8) = (uint8_t *)"11111111";
*(a+16) = (uint8_t *)"22222222";
*(a+24) = (uint8_t *)"33333333";
*(a+32) = (uint8_t *)"44444444";
*(a+40) = (uint8_t *)"55555555";
*(a+48) = (uint8_t *)"66666666";
printf("%s\n", *a);
printf("%s\n", *(a+8));
printf("%s\n", *(a+16));
printf("%s\n", *(a+24));
printf("%s\n", *(a+32));
printf("%s\n", *(a+40));
printf("%s\n", *(a+48));
return 0;
}
17也不行
#include <stdio.h>
typedef unsigned char uint8_t;
int main(void)
{
uint8_t *a; // 这里为什么是 17 呢?小于17的数都不行
printf("%d, %d, %d, %d\n", sizeof(a), sizeof(*a), sizeof(uint8_t), sizeof((uint8_t *)"00000000"));
*a = (uint8_t *)"00000000";
*(a + 8) = (uint8_t *)"11111111";
*(a + 16) = (uint8_t *)"22222222";
*(a + 24) = (uint8_t *)"33333333";
*(a + 32) = (uint8_t *)"44444444";
*(a + 40) = (uint8_t *)"55555555";
*(a + 48) = (uint8_t *)"66666666";
printf("%s\n", *a);
printf("%s\n", *(a + 8));
printf("%s\n", *(a + 16));
printf("%s\n", *(a + 24));
printf("%s\n", *(a + 32));
printf("%s\n", *(a + 40));
printf("%s\n", *(a + 48));
return 0;
}
1>------ 已启动全部重新生成: 项目: tmp, 配置: Debug Win32 ------
1>main.c
1>c:\visualstudioprojects\tmp\tmp\main.c(14): warning C4789: 缓冲区“a”(大小为 68 字节)将溢出;4 字节将在偏移 96 时开始写入
1>c:\visualstudioprojects\tmp\tmp\main.c(15): warning C4789: 缓冲区“a”(大小为 68 字节)将溢出;4 字节将在偏移 128 时开始写入
1>c:\visualstudioprojects\tmp\tmp\main.c(16): warning C4789: 缓冲区“a”(大小为 68 字节)将溢出;4 字节将在偏移 160 时开始写入
1>c:\visualstudioprojects\tmp\tmp\main.c(17): warning C4789: 缓冲区“a”(大小为 68 字节)将溢出;4 字节将在偏移 192 时开始写入
1>tmp.vcxproj -> C:\VisualStudioProjects\tmp\Debug\tmp.exe
1>已完成生成项目“tmp.vcxproj”的操作。
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
#include <stdio.h>
typedef unsigned char uint8_t;
int main(void)
{
uint8_t *a; // *(a + 48) = (uint8_t *)"66666666"; 所以这里需要49个
printf("%d, %d, %d, %d\n", sizeof(a), sizeof(*a), sizeof(uint8_t), sizeof((uint8_t *)"00000000"));
*a = (uint8_t *)"00000000";
*(a + 8) = (uint8_t *)"11111111";
*(a + 16) = (uint8_t *)"22222222";
*(a + 24) = (uint8_t *)"33333333";
*(a + 32) = (uint8_t *)"44444444";
*(a + 40) = (uint8_t *)"55555555";
*(a + 48) = (uint8_t *)"66666666";
printf("%s\n", *a);
printf("%s\n", *(a + 8));
printf("%s\n", *(a + 16));
printf("%s\n", *(a + 24));
printf("%s\n", *(a + 32));
printf("%s\n", *(a + 40));
printf("%s\n", *(a + 48));
return 0;
}
1>------ 已启动全部重新生成: 项目: tmp, 配置: Debug Win32 ------
1>main.c
1>tmp.vcxproj -> C:\VisualStudioProjects\tmp\Debug\tmp.exe
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
#include <stdio.h>
typedef unsigned char uint8_t;
int main(void)
{
uint8_t *a;
for(int i = 0; i < 17; ++i)
a = "hello world!";
for(int i = 0; i < 17; ++i)
*(a + i) = "hello world!";
*(a + 0) = "hello world!";
*(a + 16) = "hello world!";
return 0;
}
人造人 发表于 2018-2-24 14:25
为什么我的没有警告也没有报错呢,我用的是 gcc,难道是 gcc 的问题? 哥斯拉不说话 发表于 2018-2-24 15:16
为什么我的没有警告也没有报错呢,我用的是 gcc,难道是 gcc 的问题?
sh-4.4$ gcc -Wall main.c
main.c: In function 'main':
main.c:9:16: warning: format '%d' expects argument of type 'int', but argument 2 has type 'long unsigned int' [-Wformat=]
printf("%d, %d, %d, %d\n", sizeof(a), sizeof(*a), sizeof(uint8_t), sizeof((uint8_t *)"00000000"));
^
main.c:9:16: warning: format '%d' expects argument of type 'int', but argument 3 has type 'long unsigned int' [-Wformat=]
main.c:9:16: warning: format '%d' expects argument of type 'int', but argument 4 has type 'long unsigned int' [-Wformat=]
main.c:9:16: warning: format '%d' expects argument of type 'int', but argument 5 has type 'long unsigned int' [-Wformat=]
main.c:9:16: warning: format '%d' expects argument of type 'int', but argument 2 has type 'long unsigned int' [-Wformat=]
main.c:9:16: warning: format '%d' expects argument of type 'int', but argument 3 has type 'long unsigned int' [-Wformat=]
main.c:9:16: warning: format '%d' expects argument of type 'int', but argument 4 has type 'long unsigned int' [-Wformat=]
main.c:9:16: warning: format '%d' expects argument of type 'int', but argument 5 has type 'long unsigned int' [-Wformat=] 人造人 发表于 2018-2-24 15:20
我用了 -Wall 也没有这些警告 哥斯拉不说话 发表于 2018-2-24 15:30
我用了 -Wall 也没有这些警告
截图看看 人造人 发表于 2018-2-24 15:31
截图看看
这是截图 哥斯拉不说话 发表于 2018-2-24 15:33
这是截图
你的gcc是从哪里安装的?
cygwin ?
人造人 发表于 2018-2-24 15:43
你的gcc是从哪里安装的?
cygwin ?
电脑是 xp 的,在百度上搜索了 “xp 32位gcc 下载”,然后随便下了一个 人造人 发表于 2018-2-24 15:43
你的gcc是从哪里安装的?
cygwin ?
这个是 gcc -v 的输出 哥斯拉不说话 发表于 2018-2-24 15:50
这个是 gcc -v 的输出
换一个gcc试试
用cygwin试试
这是我的gcc
sh-4.4$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-cygwin/5.4.0/lto-wrapper.exe
Target: x86_64-pc-cygwin
Configured with: /cygdrive/i/szsz/tmpp/gcc/gcc-5.4.0-1.x86_64/src/gcc-5.4.0/configure --srcdir=/cygdrive/i/szsz/tmpp/gcc/gcc-5.4.0-1.x86_64/src/gcc-5.4.0 --prefix=/usr --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc --docdir=/usr/share/doc/gcc --htmldir=/usr/share/doc/gcc/html -C --build=x86_64-pc-cygwin --host=x86_64-pc-cygwin --target=x86_64-pc-cygwin --without-libiconv-prefix --without-libintl-prefix --libexecdir=/usr/lib --enable-shared --enable-shared-libgcc --enable-static --enable-version-specific-runtime-libs --enable-bootstrap --enable-__cxa_atexit --with-dwarf2 --with-tune=generic --enable-languages=ada,c,c++,fortran,lto,objc,obj-c++ --enable-graphite --enable-threads=posix --enable-libatomic --enable-libcilkrts --enable-libgomp --enable-libitm --enable-libquadmath --enable-libquadmath-support --enable-libssp --enable-libada --enable-libgcj-sublibs --disable-java-awt --disable-symvers --with-ecj-jar=/usr/share/java/ecj.jar --with-gnu-ld --with-gnu-as --with-cloog-include=/usr/include/cloog-isl --without-libiconv-prefix --without-libintl-prefix --with-system-zlib --enable-linker-build-id --with-default-libstdcxx-abi=gcc4-compatible
Thread model: posix
gcc version 5.4.0 (GCC)
人造人 发表于 2018-2-24 15:56
换一个gcc试试
用cygwin试试
printf 那里改成 %ld 就行了 人造人 发表于 2018-2-24 15:56
换一个gcc试试
用cygwin试试
还是原来的代码,改成 %ld 之后,什么警告都没有了,编译运行,都没问题啊,还是不清楚那个 *a[] 里应该填多少 人造人 发表于 2018-2-24 15:56
换一个gcc试试
用cygwin试试
这是新换的 gcc 哥斯拉不说话 发表于 2018-2-24 16:03
还是原来的代码,改成 %ld 之后,什么警告都没有了,编译运行,都没问题啊,还是不清楚那个 *a[] 里应该 ...
问题是这个
1>------ 已启动全部重新生成: 项目: tmp, 配置: Debug Win32 ------
1>main.c
1>c:\visualstudioprojects\tmp\tmp\main.c(14): warning C4789: 缓冲区“a”(大小为 68 字节)将溢出;4 字节将在偏移 96 时开始写入
1>c:\visualstudioprojects\tmp\tmp\main.c(15): warning C4789: 缓冲区“a”(大小为 68 字节)将溢出;4 字节将在偏移 128 时开始写入
1>c:\visualstudioprojects\tmp\tmp\main.c(16): warning C4789: 缓冲区“a”(大小为 68 字节)将溢出;4 字节将在偏移 160 时开始写入
1>c:\visualstudioprojects\tmp\tmp\main.c(17): warning C4789: 缓冲区“a”(大小为 68 字节)将溢出;4 字节将在偏移 192 时开始写入
1>tmp.vcxproj -> C:\VisualStudioProjects\tmp\Debug\tmp.exe
1>已完成生成项目“tmp.vcxproj”的操作。
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========
哥斯拉不说话 发表于 2018-2-24 16:03
还是原来的代码,改成 %ld 之后,什么警告都没有了,编译运行,都没问题啊,还是不清楚那个 *a[] 里应该 ...
uint8_t *a;
a是数组,数组里面有17个元素(0~16),每个元素都是一个指针,uint8_t类型的指针
哥斯拉不说话 发表于 2018-2-24 16:03
还是原来的代码,改成 %ld 之后,什么警告都没有了,编译运行,都没问题啊,还是不清楚那个 *a[] 里应该 ...
#include <stdio.h>
typedef unsigned char uint8_t;
int main(void)
{
uint8_t *a;
for(int i = 0; i < 17; ++i)
a = "hello world!";
for(int i = 0; i < 17; ++i)
*(a + i) = "hello world!";
*(a + 0) = "hello world!";
*(a + 16) = "hello world!";
return 0;
}
*(a + 0) = "hello world!"; // 数组的第0个空间
*(a + 16) = "hello world!"; // 数组最后一个空间
页:
[1]
2