哥斯拉不说话 发表于 2018-2-24 11:05:14

*a[]

为什么小于17的数,下边的 printf 都不显示东西呢,大于17就可以

人造人 发表于 2018-2-24 13:03:31

贴代码

哥斯拉不说话 发表于 2018-2-24 14:15:22

人造人 发表于 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;
}

人造人 发表于 2018-2-24 14:24:35

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 个 ==========

人造人 发表于 2018-2-24 14:25:41

#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 15:16:52

人造人 发表于 2018-2-24 14:25


为什么我的没有警告也没有报错呢,我用的是 gcc,难道是 gcc 的问题?

人造人 发表于 2018-2-24 15:20:54

哥斯拉不说话 发表于 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:30:40

人造人 发表于 2018-2-24 15:20


我用了 -Wall 也没有这些警告

人造人 发表于 2018-2-24 15:31:17

哥斯拉不说话 发表于 2018-2-24 15:30
我用了 -Wall 也没有这些警告

截图看看

哥斯拉不说话 发表于 2018-2-24 15:33:36

人造人 发表于 2018-2-24 15:31
截图看看

这是截图

人造人 发表于 2018-2-24 15:43:22

哥斯拉不说话 发表于 2018-2-24 15:33
这是截图

你的gcc是从哪里安装的?
cygwin ?

哥斯拉不说话 发表于 2018-2-24 15:48:23

人造人 发表于 2018-2-24 15:43
你的gcc是从哪里安装的?
cygwin ?

电脑是 xp 的,在百度上搜索了 “xp 32位gcc 下载”,然后随便下了一个

哥斯拉不说话 发表于 2018-2-24 15:50:50

人造人 发表于 2018-2-24 15:43
你的gcc是从哪里安装的?
cygwin ?

这个是 gcc -v 的输出

人造人 发表于 2018-2-24 15:56:48

哥斯拉不说话 发表于 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 16:01:52

人造人 发表于 2018-2-24 15:56
换一个gcc试试
用cygwin试试



printf 那里改成 %ld 就行了

哥斯拉不说话 发表于 2018-2-24 16:03:39

人造人 发表于 2018-2-24 15:56
换一个gcc试试
用cygwin试试



还是原来的代码,改成 %ld 之后,什么警告都没有了,编译运行,都没问题啊,还是不清楚那个 *a[] 里应该填多少

哥斯拉不说话 发表于 2018-2-24 16:05:13

人造人 发表于 2018-2-24 15:56
换一个gcc试试
用cygwin试试



这是新换的 gcc

人造人 发表于 2018-2-24 16:05:51

哥斯拉不说话 发表于 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:07:19

哥斯拉不说话 发表于 2018-2-24 16:03
还是原来的代码,改成 %ld 之后,什么警告都没有了,编译运行,都没问题啊,还是不清楚那个 *a[] 里应该 ...

uint8_t *a;

a是数组,数组里面有17个元素(0~16),每个元素都是一个指针,uint8_t类型的指针

人造人 发表于 2018-2-24 16:09:15

哥斯拉不说话 发表于 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
查看完整版本: *a[]