极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: Stormer

请教下C语言里的字符比较

[复制链接]
发表于 2017-8-16 14:27:14 | 显示全部楼层

暈......你看看是否去錯區了.  這裡是  Arduino 區.

你再用 Arduion IDE 試試吧.   
結果又是那一回事, 會變成了 地址的一半.
而且, 你得到的 0, 也不能肯定是 ""[0] 還是地址剛好是 0.  最緋要看語言編譯的設定.

回复 支持 反对

使用道具 举报

发表于 2017-8-16 14:52:21 | 显示全部楼层

一般 c 語言都不會出現你說的設定, 但我沒用過 c-free, 不敢亂作定論.
所以, 剛作直接下載 c-free 進行測試, 結果證明就是 c-free  也沒分別, 同樣證明你的說法是錯的, 請不要再誤導別人了.

你一直只是從答案去胡扯原因, 沒有認真看看答案是怎樣得出來的.
你得到的那個 0, 只是數值上是 0, 但他的來源, 並不是 zero terminate 中的 0.
只要簡單測試一下, 就可以證明是我之前一直說的, 是地址上的 0.

答案也很容易證明, 只要不去胡扯, 認真多試一下, 就可以看出來.
第一個 常數, 地址是 0 也很平常.  怎麼去不多試一個, 結果就很清楚了.
注意, 同樣的常數, 編譯時會被合時同一個, 所以地址會一樣.  
測試時要加入不同的變數, 最簡單是在 最前加入一個 char a  = "a"; , 看看結果會是什麼吧.


回复 支持 反对

使用道具 举报

发表于 2017-8-16 19:38:10 | 显示全部楼层
Super169 发表于 2017-8-16 14:52
一般 c 語言都不會出現你說的設定, 但我沒用過 c-free, 不敢亂作定論.
所以, 剛作直接下載 c-free 進行 ...

我用C-Free 是因为Arduino的编译器是和C-free一样的。我说过Arduino是基于C语言的,看硬件里面的main文件。
而你会觉得我是新学C语言,这可能是因为我所说的,都不是最新编译器可以编译的。
的确,按照我所说的,在最新的Visual Studio 上根本就不可能编译通过的 char cResult="" 这种语法会报错的。
但是,我是根据Arduino用的编译器,才这么告诉他的。
而且 我都是自己编译过 才会告诉他的。如果你觉得不太可能,干嘛不自己去实际编译一下 去试试 。为什么总是让别人去试呢

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2017-8-17 00:52:14 | 显示全部楼层
本帖最后由 Super169 于 2017-8-17 01:08 编辑
qq576193486 发表于 2017-8-16 19:38
我用C-Free 是因为Arduino的编译器是和C-free一样的。我说过Arduino是基于C语言的,看硬件里面的main文件 ...


我早說過,明白原因,比知道答案重要。
從你之前的回覆, 明顯看出你是初學的.
如果我直接貼出來, 你可能就不會去試, 將來很快就會忘記.
多嘗試, 自己找到自己錯誤, 才是最有意義的.  
而且, 我跟你說明了很多次, 你也不信呢, 還是讓你自己試出來更好.

我也不是什麼都用過的, 看到你是用 c-free, 我之前真水沒用過 c-free, 雖然機會很微, 我也怕 c-free 會有特別設定, 怕自己錯怪了你.
所以我也下載  c-free 5.0 測試過, 證明我說的沒錯, 才再回應你的.  
並非如你所想的沒試過, 只是我希望你可以學會怎樣試, 所以沒直接貼出來.
我並不是自己"覺得不太可能", 而是從以往的經驗及認知, 我知道是"不太可能", 但我也不敢掉以輕心, 再三證實了是"不可能".

你說你有编译过 , 如果還是得到原來的想法, 就是你不懂得怎樣去試了.
為免你走太多冤枉路, 我已提醒你了, 如何分辦你得到的 0, 是否一個地址的一部份.

是我沒說清楚嗎?  你怎麼不嘗試用 c-free 跟我之前說的做一次.  
就在你 15樓貼的程式開頭, 加上一句 char a = "a";  在 char c = ""; 之前.
結果如何?  之後的 printf("%d",c); 還是得到 0 嗎?  我想你是沒試過吧.  

看你也不是完全不願意去試的人, 只是方法有點問題.
如果你明天還是想不通, 我就用你在 15樓貼的程式, 教你怎樣測試, 證實那是地址的一部份, 而非你想的 字符串的结尾补上\0 吧.
就是看到了數字, 也要學會找出那個數字的由來.  一個 0, 也可以有很多意思的.

其實你 18樓也只是看到 c 的值是 0, 那個 0 是什麼意思, 怎麼不去想想.
如果你之前說  char c = ""; 時, 結果為 0, 是因為 字符串的结尾补上\0 , 那為什麼 char c = "a"; 時, 不是變成 'a' 呢?
回复 支持 反对

使用道具 举报

发表于 2017-8-17 14:40:52 | 显示全部楼层
Super169 发表于 2017-8-17 00:52
我早說過,明白原因,比知道答案重要。
從你之前的回覆, 明顯看出你是初學的.
如果我直接貼出來, 你 ...

我就是知道了原因 才告诉他的。至于是不是初学,只能说呵呵了。你说的东西,你自己都没去试过,我说的东西,我都是实际测试过,才给他的。
回复 支持 反对

使用道具 举报

发表于 2017-8-17 23:13:03 | 显示全部楼层
本帖最后由 Super169 于 2017-8-18 00:27 编辑
qq576193486 发表于 2017-8-17 14:40
我就是知道了原因 才告诉他的。至于是不是初学,只能说呵呵了。你说的东西,你自己都没去试过,我说的东 ...


我说过让你好好想一天, 还不明白的话, 自然会给你答案的.
如果你真的不是初学, 而且还真的是测试过, 那真的难以致信了.  
当然, 有测试过, 跟测试的结果是否正确, 也有很大影响的.
你是先假定了结果去测试, 看到一个答案配合, 没考虑到巧合的因素, 就当成真理了.
所以我一直都说, 明白原因, 比知道答案重要.  你就是一个活生生的例子了.

单说你是不会服的, 那我就用程式从头解释一次吧, 全部跟你用 c-free 去测试.

(1) 问题的根源, 在於你在 8楼的胡乱总结: char cResult="";//其实类似于 char cResult=0;

我在 9楼向你提问: char cResult = "";  为什麽一定是 0?  

你在 11 楼的回应, 那个 0 的原因: 一个字符串的结尾就是要补上\0

之後你在 15楼 用程式回应了我, 以程式結果 c 的值变成 0, 去证明你的谬论.  (說實在的, 我也不肯定你那個例子想證明什麼.)

其实, 我在 17楼已给你提示, 19楼再提示一次, 你就是不去试试.  还好意思说自己有试过.

如果你真有试过的话, 请问以下程式, 结果会是什麽?


  1. #include <stdio.h>                                                                                       

  2. int main(int argc, char *argv[])                                                                          
  3. {                                                                                                         
  4.         char a = "a";
  5.         char c = "";
  6.         printf("%d", c);
  7.         return 0;
  8. }   
复制代码
                                                                                                     

这个测试, 就可以证明你说的 "一个字符串的结尾就是要补上\0", 只是把不相关的东西, 胡扯过来.
"一个字符串的结尾就是要补上\0", 这是对的, 但跟 char cResult = "";  得到结 0 结果, 是两码子的事.

如果依你上面的说法, c 应该是 0 吧.  结果真的是 0 吗?



事实上, 严格来说应该是不肯定的结果.  但一般 常数会在一个新的 segment 去编排, 所以结果几乎是固定的.
所以, 你在 c-free 中执行, 应该也是会得到 2, 而不是 0.
因为这是常数 "" 的地址的尾数部份 (之後再解释为何是一部份).  
当它是第一个常数时, 地址尾数是 0.  而你看到 0 的值, 就当成了是 zero terminate 的 \0 了.
当它是第二个常数时, 地址尾数就变成了 2 (還要看前面佔的空間, 不是固定為 2 的).  因為前面佔了 2 個位, 所以 结果就是 2 了.
如果前面是 char a = "12345";, c  的值又會變成 6 了 (這是因為 "12345" 佔了 6 個 byte, 第6 個是什麼, 你應該明白的.)
不信的话, 你可以加入 printf("%d", a); 去看看, 结果会是 0.



如果根据你 11 楼的说法, 应该是 97 ('a' 的 ascii 值), 但结果是 0.  
如果还有怀疑, 可以多加几个常数, 看看它们的变化吧.

(2) 你 11楼说的: char cResult="" 就变成了char 指针变量了
    我在 13楼问你时, 你在 13楼时解释: 这里就强制改变了变量类型

这是基於你对 implicit type conversion 的误解.
其实我在 14楼已解释了一次, 不想再解释了, 有兴趣请看 14楼.
现在就证明一下给你看吧.
其实 c 是严谨的语言, 在定义後变数是不会改变的, 本来就不需要什麽证明.
但既然你不慬, 只好尝试用简单方式去证明吧, 请看看以下程式:
由於 c 本身没有 typeof, 只好用 sizeof 去证明:



这里 a, b 都是 char*, 虽然有着不同的字串, 但它所占的空间是一样的, 都是 4.
而 c 虽然经过了 char c = "";, 但它所占的空间, 依然是 1, 不会变成 4.  
虽然 sizeof 一样, 并不代表就是相同的 type, 但 sizeof 不一样, 就肯定是不同的了.
所以, 这就可以证明, c 不会因为被放进 "", 而变成一个指针了.

(3) 现在. 可以解释一下, 之前所说的 地址的尾数, 是什麽意思.  

要了解原因, 先要知道 c 语言中, "=" 的作用.
在 c 语言中, "=" 是不会改变原来的变数的类型的.
在一般情况下, 简单同类的 "=", 就是直接把有关的值 copy 过去.  int = int.
在不同类之下, 结果会怎样?  同样是简单的 copy, 但就是会把 可以放的地方填满.
这是什麽意思呢?  我尝试用以下例子解释 (为了方便讲解, 以 unsigned 的数值去看吧)
比如 unsigned char = unsigned int, 而 unsigned char 只有 1 byte, 数值是 0-255.
当 unsigned int 数值大於 255 时, 就会只 copy 1 个 byte, 由於数值是倒转记录的, 结果第一个 byte 就是数值最一个 byte 了.  
這也有很多不用的理解, 可以看成是把 hex 的尾數放進去.  因為數值是用倒序去儲存, 就是由第一個 byte 開始放.
我尝试做一个例子, 给你看看吧.  如果你能看得懂每一个结果的由来, 你应该对 "=" 有多一点认识了.



9999 的 hex 是 27 0f,  尾數的一個 byte 是 0f, 所以 a 就被放進了 f 的值.
而 d 就是 b  的第一個 byte, e 是第 2 個 byte, 可以看到, 第一個 byte 是 f, 第二個是 27.
數值在記憶體上的儲存, 是倒序的.  所以數值是最尾的一個 byte, 就是儲存時第一個 byte.

這個做法, 可以看成是 強制改變了要 複製的數據了.  原本是要複制 270f, 現在變成只有 0f.
注是, 是改變要 複製的數據, 而不是改變儲存的變數.   a 依然是 char, 不會變成 int.

(4) 最後, 就解释一下, 为什麽你之前那个 char c = ""; 会得到 0 的值.

首先, "" 是一个 const char*, 而一个指针的值, 就是对应的数据的存放地址.
由於 const char* 是 4 byte, 而 char 只有 1 byte.  基於 (3), 你应该明白 "=" 会怎样做吧.
就是把 (const char*) 地址的数值最一个 byte, 放进 c 去.

当 char c = ""; 是第一句程式时, 由於常量基本上会分开储存, 第一个就占了该 segment 的 0 位 (注意, 不是绝对肯定的, 可能因为某些原因, 被其他资料占了 0 位.)
所以, 当在 char c = ""; 之前, 加上 char a = "a"; 时,  第一个常量变成了 "a" 而占了 0 位, "" 就变成下一个了.  而 "a" 是字串, 有兩個 byte, 分別是 'a' 及結尾的 \0, 所以下一個常數, 就要放到 2 byte  之後了.

相信配合 (3) 对 "=" 的讲解, 你应该明白, 为什麽我说 char c = ""; 时, c 为 0 的值是地址的尾数吧.


希望你看了以上的解释, 不会再去胡扯了.  认认真真去了解 =  的作用吧.
如果还有什麽地方不明白, 又或是不相信的话.  不妨说说你的想法.

或許讓你溫習一下, 試試不執行程式, 猜猜結果是什麼, 然後再執行一次, 對比一下結果是否如你所想的吧:

  1. #include <stdio.h>                                                                                       
  2.                                                                                                          
  3. int main(int argc, char *argv[])                                                                          
  4. {                                                                                                         
  5. char c = "a";                                                                                            
  6. char* a = "123";                                                                                         
  7. char b = "a";                                                                                            
  8. char d;                                                                                                  
  9. char e;                                                                                                  
  10. char f;                                                                                                  
  11. d = *(&c);                                                                                               
  12. e = *a;                                                                                                  
  13. printf("a: %d\n", a);  // 這會是什麼? 是指針的地址                                                      
  14. printf("b: %d\n", b);  // 這會是什麼? 是 b 現在的值?                                                   
  15. printf("c: %d\n", c);  // 這又是什麼? 是 c 現在的值, 那 c 的值又是什麼, 為什麼跟 b 一樣呢?   看看 17樓有解釋的.        
  16. printf("d: %d\n", d);  // 這會是什麼? 同樣是 c 的值                                                     
  17. printf("e: %d\n", e);  // 這會是什麼?                                                                  
  18. printf("f: %d\n", f);  // 這會是什麼?                                                                  
  19. printf("sizeof(a): %d\n", sizeof(a));  // 那是一個指針的大小                                             
  20. printf("sizeof(c): %d\n", sizeof(c));  // 如果 c  真的變成指針, 就會跟上面的一樣.                        
  21. printf("sizeof(f): %d\n", sizeof(f));  // 如果 c 真的變了, 怎麼跟 f 一樣的?                              
  22. return 0;                                                                                                
  23. }      
复制代码
            

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2017-8-18 10:09:03 | 显示全部楼层
qq576193486 发表于 2017-8-17 14:40
我就是知道了原因 才告诉他的。至于是不是初学,只能说呵呵了。你说的东西,你自己都没去试过,我说的东 ...

再补充一点, 就是有关测试的方法, 以及你所谓的测试了.

你的问题, 应该在於 8楼中的:

  1. char cResult="";//其实类似于 char cResult=0;
复制代码


而你这个想法, 是基於你在 15楼的测试程式的结果吧:

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char c="";
  5.         printf("%d",c);
  6.         return 0;
  7. }
复制代码


由於得到一个 0 的结果, 你就更深信自己的想法, 以为这个 0 是来自於自串 "" 结尾补上的 \0 吧.

事实上, 这个测试程式太多不足的地方了, 一个 a = b 的语句, 当中 "=" 的功用, 如果只是基本的设置, 例如 int = int, 可以是简单的 copy.  但对於有不对等的 设置, 比如 char = char*, 结果就要看不同语言的做法, 并非每个语言都一样的.

基於你的想法, 如果要证明 是会变成  char c = ""[0];  (即把字串中第一个位放进去, 而 "" 就是补上的 0).
这就简单不过了, 只要你测试一下, char c = "a"; 看看结果是否把 'a' 放进去, 不就明白了吗?
看到你 11楼的回应, 好肯定你是没有测试过了.

如果你是有心测试 char c=""; 是否会得到 0, 而当中的 0 会否是一个地址, 还可以有很多方法.  
但要了解语言上, 对常数的安排, 否则, 如果你用以下的程式去测试, 只会再一步深信那个错误的想法:

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char c="";
  5.         int a = 1;
  6.         char d = "";
  7.         printf("c: %d\n",c);
  8.         printf("d: %d\n",d);
  9.         return 0;
  10. }
复制代码


以上的程式, c 及 d 都是 0, 你可能会得出那个 0 不是地址的想法了, 因为它们在不同的语句中, 而且中间隔了一个 int a = 1;
我就是怕你会造出类似的错误测试, 所以在 17楼 先提点你 "注意, 同样的常数, 编译时会被合时同一个, 所以地址会一样.".
可惜, 你就是不会去测试呢.

其实不单止 "" 会被合成一个, 只要数值是一样的, optimizer 同样会把它们合成一个常数.
试试以下程式就会明白了:
#include <stdio.h>

  1. int main()
  2. {
  3.         char a = "abcdef";
  4.         char b = "bbb";
  5.         char c = "abcdef";
  6.         char d = "abcdef";
  7.         char e = "bbb";
  8.         printf("a: %d\n",a);
  9.         printf("b: %d\n",b);
  10.         printf("c: %d\n",c);
  11.         printf("d: %d\n",d);
  12.         printf("e: %d\n",e);
  13.         return 0;
  14. }
复制代码


不过, 有一点要主意, 并非每个 optimizer 都会这样做, 因为这并非语言中必要的东西.  
但绝大部份好的 optimizer 都会做的, 因为可以为程式节省空间.

同样, 上面的例子, a,b,c,d,e 的值, 正如说明了常量的编排, 以及进一步证明那个 = 的结果, 跟储存地址是有关的.

希望经过今次, 你可以明白到, 有测试不等於测试就是正确, 必须要找出有效的测试, 并考虑同一个结果, 可以出现的可能性.
情况就好像 "有奶便是娘" 一样:

娘是有奶的没错,  但有奶的,  不一定就是娘,  有奶的还可以是其他人呢.
字串的结尾是会补上一个零没错,  但得到一个零,  不一定就是字串结尾补上的零,  那个零还可以有其他意思呢.
回复 支持 反对

使用道具 举报

发表于 2017-8-18 16:30:29 | 显示全部楼层
Super169 发表于 2017-8-18 10:09
再补充一点, 就是有关测试的方法, 以及你所谓的测试了.

你的问题, 应该在於 8楼中的:

那就是一样的了,我说char cResult="" 这里把cResult转变为指针类型的变量
那么cResult 里面存的就是地址
正如你所说
char a=""
char c="c"
那么 a c 就是指针 里面当然存的是地址
但是a c 的指针变量 里面存的 就是字符串了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2017-8-18 17:30:44 | 显示全部楼层
qq576193486 发表于 2017-8-18 16:30
那就是一样的了,我说char cResult="" 这里把cResult转变为指针类型的变量
那么cResult 里面存的就是地 ...


唉....看来你还是不懂, 而且还是不肯认错的.
看你的回应, 你是应该完全明白自己的错误, 只是强行辩护.
而且, 明显看得出, 你还是走不出 "有奶便是娘" 的思考框框.

请问你之前说的那個 0 來自 "一个字符串的结尾就是要补上\0", 现在还成立吗?
这个算了, 反正你已不再撑了.

那麽 "转变为指针类型的变量", 请问什麽叫转变.
你的结果也比较奇怪, 可能我不懂 c-free 的设定, 但我用了两台电脑, 都安装了 c-free 去试, 都不可能得到你的结果.
[001]

至於你为何得到那结果, 先排除你作假的可能性.  
如果你可以说说是怎样做出来, 或者我可以帮你试出真正的原因.  现在只可以跟据常理去推测.

我之前已说过, a 是记录了地址的一部份, 而进行 print("%s", a) 时, 我不肯定 printf 在收到一个 char, 要转成 (cahr *) 时, 会怎样补上去.
由阔转窄, 就会是收窄了空间.  但由 1 byte 转 4 byte, 真系要看编译器的处理.  
有可能是补 0, 也有可能是填上相同的 segment (只针对地址的可能性), 亦有可能是 memcpy 相连的 4 个 byte.
或许在你的情况下, 会补上当前的 segment (虽然我不认为会这样, 但如果你没做假, 结果可能就是这样.).
这样, printf 有可能会收到一个完整的地址, 而这个地址就是那个常数的地址.
这只是 printf 得到了一个完整的地址, 而非 a 储存了完整的地址.
这正正就是 "有奶便是娘" 的例子了.  地址的尾数是 a, 但 a 并非就是整个地址.

这里比较复杂, 以你的能力, 要明白不容易.
你要先对记忆体储存资料的方法, 有一定的认识.

要用 非指针去记录指针, 不是没可能的, 但绝不会是 char.
而且, 只是记录了, 共非换变了.
这同样是 "有奶便是娘" 的问题.  记录了一个相同的值, 有这个值不等於就是转换了.

因为电脑的资料, 只不过都是一些 0 1 的讯号, 不同的资料, 也可以有相同的数值.
比如你可以 char c = '1'; 又或者 char c = 49; , 结果都是一样的.
但 char c = 49; 并没有把 c 由 char 转变成 int, 只是 c 的值是 49.
你不可能因为 c 的值是 49, 就说它是 int 吧.  
如果你有这想法, 那麽全部变数都是 int 了, 反正都是 0 1 的组合.
要说明这点, 你就要了解变数的值, 跟变数的类之间的关系了.

你现在看到的, 只是储存的数值一样, 但并非改变了类形, 这是很根本的基础.  
你连这点也分不清, 所以我才一直说你是初学的.

其实, 在 14楼 我已跟你说过了, 用 int = (char *) 是合理的, 有很多时候, 我也会用类似的特性, 用不同类的储存去处理数据.
最常用的例子, 是用 byte* (或 unsigned char*) 去处理任何数据的传送.

但不论把什麽数值放进去, 也要明白, 它只是放了一个数值, 而不是改变了原来的类型.

又再回到 0 的根本问题了, 如果只说某个变数的值是 0, 你说这是一个什麽类的?
再想想, "有奶便是娘" 的例子吧.  希望你可以分清楚.

回复 支持 反对

使用道具 举报

发表于 2017-8-18 17:32:27 | 显示全部楼层
本帖最后由 Super169 于 2017-8-18 17:42 编辑

不知為何, 貼不上圖, 這是我執行你那程式的結果 (再貼一次):


我只是把自己的結果放出來, 雖然結果是 null, 但不代表一定是 null 的, 因為對 printf("%s", char) 的結果還是不太肯定.
如果你沒做假, 或許是會自動填上對應的 segment,  但這點我還是覺得不大可能.

如果你用的是 int a = "abcdef";, 那是非常合理, 因為 int 是足夠記錄 const char* 的.
但 char a = "abcdef";, a 只有一個 byte 的空間, 不可能放下 4 個 byte 的 const char*.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2017-8-18 17:54:03 | 显示全部楼层
qq576193486 发表于 2017-8-18 16:30
那就是一样的了,我说char cResult="" 这里把cResult转变为指针类型的变量
那么cResult 里面存的就是地 ...

如果可以的話, 希望可以嘗試執行以下程式, 把結果發給我看看.  讓我猜猜為何你可以得到那個你之前那個結果.

  1. #include <stdio.h>
  2. int main()
  3. {
  4.     char a = "";
  5.     char b = "abcdef";
  6.     char c = "";
  7.     int x = &a;
  8.     int y = &b;
  9.     int z = &c;
  10.     printf("a: %d\n", a);
  11.     printf("b: %d\n", b);
  12.     printf("c: %d\n", c);
  13.     printf("x: %d\n", x);
  14.     printf("y: %d\n", y);
  15.     printf("z: %d\n", z);
  16.     printf("%s", b);
  17.     return 0;
  18. }
复制代码


正常情況下, printf("%s", char) 是不合理的, 我想確認一下, 在執行時, 你的記憶體內的資料.
這可以有效地解釋你的結果.


還是想你再試試, 你 23樓貼的那個程式, 真的可以得出那結果?  會不會你原本是 int a, 而不是 char a 的.  又或者是之前的結果?  像下面的:

那個結果, 並不是當前程式執行的結果.

因為你那個結果, 不論是什麼 c compiler 去做, 都有點不合理的.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2017-8-18 22:06:21 | 显示全部楼层
Super169 发表于 2017-8-18 17:54
如果可以的話, 希望可以嘗試執行以下程式, 把結果發給我看看.  讓我猜猜為何你可以得到那個你之前那個結 ...

如果你一直在用理论,而不是自己去测试的话。那就无所谓了,你愿意觉得我错,那就就觉得好了。纸上谈兵嘛,很厉害
回复 支持 反对

使用道具 举报

发表于 2017-8-18 22:56:37 | 显示全部楼层
qq576193486 发表于 2017-8-18 22:06
如果你一直在用理论,而不是自己去测试的话。那就无所谓了,你愿意觉得我错,那就就觉得好了。纸上谈兵嘛 ...

你一直只会胡说我没测试过, 但就没看看我说了什麽.
上面已给你这麽多实证, 比你测试的要多几倍, 还可以赖说我没去测试, 真的是冥顽不灵.  
你一直只用一两个没意义的测试就当证明了一切, 真正没测试的人只是你自己.

而且, 再三跟朋友研究过, 你最後那个测试, 应该是造假的, 任何一个 c 语言, 也不应该有这样的结果.  
把 char 放到 (char *), 就是地址的尾数正确, 前面的几个 byte, 是不可能填上所要的 segment.
第三个是 0 可能会理, 但最两个不可能是 0, 所以, 就连巧合机会也不大可能.  最有可能就是造假了.
或许你是想测试我的基本知识吧, 要玩弄这手段, 实在有点无聊了.
是真是假不重要了, 你自己心中有数吧, 相信你也不会说真话, 这里的朋友可以试试他的程式, 到底谁在造假, 一切都很清楚了.

恕我倒楣, 一心想帮人, 竟然碰上一个这样子的人.
要教你不是我的责任, 上面已给了足够的例证及解释, 谁是谁非, 看的人绝对可以明白了.
你还是要执迷於"有奶便是娘"的想法, 恕我无兴趣奉陪了.
你喜欢的话, 就当我在骗你吧.  
反正大部份测试程式都放了出来, 就让有兴趣的人, 可以看看谁是谁非, 我亦无意再跟你纠缠了.
回复 支持 反对

使用道具 举报

发表于 2017-9-21 00:43:56 | 显示全部楼层
qq576193486  指针是C语言的难点,你还是认认真真去学习下指针。
Super169   对你的详细且耐心回帖表示敬重。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 01:11 , Processed in 0.055416 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表